Почему ввод пароля работает в конвейерной команде sudo?

Если я сделаю:

sudo cat /etc/resolv.conf | less

Он запросит у меня пароль, хотя меньше (предположительно) занимает стандартный ввод. По каким файлам отображается запрос пароля и как он возвращает ввод?

2 ответа

Решение

На самом деле, типичный вызов sudo не читает пароль от stdin совсем. Вместо, sudo будет иметь прямой доступ к управляющему терминалу (tty или же ptyчерез /dev/tty специальный файл) и выводить подсказку и читать символы напрямую. Это можно увидеть в tgetpass.c файл в sudo источник.

Есть несколько других сценариев:

  • Если askpass Программа указана, например, в -A param, эта программа будет вызвана.
  • В противном случае, если вы специально запросите sudo читать с stdinнапример, с -S флаг - и он также напишет подсказку stderr, Это тот случай, когда ответ MadHatter применяется.
  • В противном случае, если нет tty имеется в наличии
    • Если эхо пароля отключено (по умолчанию оно контролируется visiblepw флаг в sudoers), sudo сообщит об ошибке: no tty present and no askpass program specified
    • Иначе, sudo вернется к использованию stdin а также stderr даже если это не было специально запрошено. Ответ MadHatter также будет применяться здесь.

Труба соединяет sudo catвыложено lessхм, так sudo catSdin не влияет и может получить пароль.

Что касается приглашения, оно выходит на sudo cats stderr; в bash, попробуйте перенаправить это вместе с stdout, используя

sudo cat /etc/resolv.conf |& less

и посмотрите, насколько отличается ответ.

Другие вопросы по тегам