Відповіді:
Насправді типовий виклик 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 specifiedsudoповернуся до використання stdinі stderrнавіть якщо вона не була запрошена спеціально. Відповідь MadHatter також стосуватиметься тут.Труба з'єднує sudo catstdout s less's stdin, тому sudo catstdin не впливає і може отримати пароль.
Що стосується підказки, вона виходить на sudo cats stderr; у bash, спробуйте перенаправити це разом із stdout, використовуючи
sudo cat /etc/resolv.conf |& less
і подивіться, наскільки різна реакція.
sudo, що stdin все ще підключений до терміналу командою example, це не має прямого значення для того, як він отримує свій пароль: за замовчуваннямsudoне буде запитувати паролі через stdin, а також не відображатиме підказку черезstderr- ви можна спробувати2>/dev/nullпідтвердити це. Натомістьsudoбезпосередньо звертається до tty.