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