Чому пароль вводить роботу в трубовій команді sudo?


25

Якщо я:

sudo cat /etc/resolv.conf | less

Він запропонує мені ввести пароль, хоча менше (імовірно) займає stdin. Над якими fd's відображається підказка пароля і як він повертає вхід?

Відповіді:


48

Насправді типовий виклик sudoпароля зовсім не читає stdin. Натомість sudoбуде безпосередньо доступ до керуючого терміналу (а ttyабо ptyчерез /dev/ttyспеціальний файл) та виводить підказку та читає символи безпосередньо. Це можна побачити у tgetpass.cфайлі у sudoджерелі.

Є кілька інших сценаріїв:

  • Якщо askpassпрограма вказана, наприклад, в -Aпараметрі, ця програма буде викликана.
  • В іншому випадку, якщо ви спеціально вимагаєте sudoпрочитати stdin, наприклад, з -Sпрапором - і він також запише запит на stderr. Це той випадок, коли стосується відповіді MadHatter.
  • В іншому випадку, якщо такої ttyнемає
    • Якщо відлуння пароля відключено (воно за замовчуванням контролюється visiblepwпрапором у sudoers), sudoповідомить про помилку:no tty present and no askpass program specified
    • В іншому випадку, sudoповернуся до використання stdinі stderrнавіть якщо вона не була запрошена спеціально. Відповідь MadHatter також стосуватиметься тут.

10

Труба з'єднує sudo catstdout s less's stdin, тому sudo catstdin не впливає і може отримати пароль.

Що стосується підказки, вона виходить на sudo cats stderr; у bash, спробуйте перенаправити це разом із stdout, використовуючи

sudo cat /etc/resolv.conf |& less

і подивіться, наскільки різна реакція.


16
Хоча ця відповідь правильна в тому sudo, що stdin все ще підключений до терміналу командою example, це не має прямого значення для того, як він отримує свій пароль: за замовчуванням sudoне буде запитувати паролі через stdin, а також не відображатиме підказку через stderr- ви можна спробувати 2>/dev/nullпідтвердити це. Натомість sudoбезпосередньо звертається до tty.
Боб
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.