Если я сделаю:
sudo cat /etc/resolv.conf | less
Он запросит у меня пароль, хотя меньше (предположительно) занимает стандартный ввод. По каким файлам отображается запрос пароля и как он возвращает ввод?
Если я сделаю:
sudo cat /etc/resolv.conf | less
Он запросит у меня пароль, хотя меньше (предположительно) занимает стандартный ввод. По каким файлам отображается запрос пароля и как он возвращает ввод?
На самом деле, типичный вызов 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 specified
sudo
вернется к использованию stdin
и stderr
даже если это не было специально запрошено. Ответ MadHatter также будет применяться здесь.Канал соединяет стандартный sudo cat
вывод less
со стандартным, поэтому стандартный sudo cat
ввод не затрагивается и может получить пароль.
Что касается подсказки, она выходит на sudo cat
s stderr; в bash, попробуйте перенаправить это вместе с stdout, используя
sudo cat /etc/resolv.conf |& less
и посмотрите, насколько отличается ответ.
sudo
смысле, что stdin все еще подключен к терминалу с помощью команды примера, это не имеет прямого отношения к тому, как он получает свой пароль: по умолчаниюsudo
он не запрашивает пароли через stdin и не отображает приглашение черезstderr
- вы могу попытаться2>/dev/null
это подтвердить. Вместо этогоsudo
напрямую обращается к tty.