Почему пароль, входящий, работает в переданной по каналу команде sudo?

Если я делаю:

sudo cat /etc/resolv.conf | less

Это предложит мне пароль, даже при том, что меньше (по-видимому), берет stdin. По какому fd's пароль является показанной подсказкой и как это возвращает вход?

25
задан 27 October 2015 в 10:31
2 ответа

Фактически, типичный вызов 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 также будет применяться здесь.
48
ответ дан 28 November 2019 в 20:12

Канал подключает стандартный вывод sudo cat к стандартному вводу less , поэтому стандартный ввод sudo cat не затрагивается , и может получить пароль.

Что касается приглашения, оно выходит на sudo cat stderr; в bash попробуйте перенаправить его вместе со стандартным выводом, используя

sudo cat /etc/resolv.conf |& less

, и посмотрите, насколько отличается ответ.

10
ответ дан 28 November 2019 в 20:12

Теги

Похожие вопросы