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