Answers:
实际上,典型的调用sudo根本不读取密码stdin。而是sudo直接访问控制终端(通过特殊文件a tty或)并输出提示并直接读取字符。可以在源文件中看到。pty/dev/ttytgetpass.csudo
还有其他一些方案:
askpass指定了程序,例如在-A参数中,则将调用该程序。sudo从中进行读取stdin(例如带有-S标志),则该提示也会将提示写入stderr。这是MadHatter的答案适用的情况。tty可用的
visiblepw标志控制sudoers),sudo则会报告错误:no tty present and no askpass program specifiedsudo将回退到使用stdin和stderr即使它没有特别要求。MadHatter的答案也将在此处适用。管道将sudo cat的stdout 连接到less的stdin,因此sudo cat的stdin不受影响,并且能够接收密码。
至于提示,它在sudo cat的stderr 上熄灭;在bash中,尝试使用stdout将其重定向,使用
sudo cat /etc/resolv.conf |& less
并查看响应有何不同。
sudostdin仍通过example命令连接到终端,但这与获取密码的方式没有直接关系:默认情况下,它sudo不会通过stdin请求密码,也不会通过stderr-您显示提示可以尝试2>/dev/null确认一下。而是sudo直接访问tty。