Ответы:
На самом деле, типичный вызов sudoвообще не читает пароль stdin. Вместо этого он sudoполучит прямой доступ к управляющему терминалу (a ttyили ptyчерез /dev/ttyспециальный файл) и выведет подсказку и прочитает символы напрямую. Это можно увидеть в tgetpass.cфайле в sudoисточнике.
Есть несколько других сценариев:
askpassуказана программа, например, в -Aпараметре, эта программа будет вызвана.sudoчтение stdin, например, с -Sфлагом - и он также напишет приглашение stderr. Это тот случай, когда ответ MadHatter применяется.ttyналичии
visiblepwфлагом в sudoers), sudoпоявится сообщение об ошибке:no tty present and no askpass program specifiedsudoвернется к использованию stdinи stderrдаже если это не было специально запрошено. Ответ MadHatter также будет применяться здесь.Канал соединяет стандартный sudo catвывод lessсо стандартным, поэтому стандартный sudo catввод не затрагивается и может получить пароль.
Что касается подсказки, она выходит на sudo cats stderr; в bash, попробуйте перенаправить это вместе с stdout, используя
sudo cat /etc/resolv.conf |& less
и посмотрите, насколько отличается ответ.
sudoсмысле, что stdin все еще подключен к терминалу с помощью команды примера, это не имеет прямого отношения к тому, как он получает свой пароль: по умолчаниюsudoон не запрашивает пароли через stdin и не отображает приглашение черезstderr- вы могу попытаться2>/dev/nullэто подтвердить. Вместо этогоsudoнапрямую обращается к tty.