Answers:
实际上,典型的调用sudo
根本不读取密码stdin
。而是sudo
直接访问控制终端(通过特殊文件a 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 连接到less
的stdin,因此sudo cat
的stdin不受影响,并且能够接收密码。
至于提示,它在sudo cat
的stderr 上熄灭;在bash中,尝试使用stdout将其重定向,使用
sudo cat /etc/resolv.conf |& less
并查看响应有何不同。
sudo
stdin仍通过example命令连接到终端,但这与获取密码的方式没有直接关系:默认情况下,它sudo
不会通过stdin请求密码,也不会通过stderr
-您显示提示可以尝试2>/dev/null
确认一下。而是sudo
直接访问tty。