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