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