Почему ввод пароля работает в конвейерной команде 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 cat
Sdin не влияет и может получить пароль.
Что касается приглашения, оно выходит на sudo cat
s stderr; в bash, попробуйте перенаправить это вместе с stdout, используя
sudo cat /etc/resolv.conf |& less
и посмотрите, насколько отличается ответ.