如果我做:
sudo cat /etc/resolv.conf | less
它会提示我input密码,即使更less(大概)需要stdin。 在fd上显示的是密码提示,它是如何得到input的?
实际上,典型的sudo
调用根本不读取stdin
的密码。 相反, sudo
将直接访问控制terminal(通过/dev/tty
特殊文件,一个tty
或pty
)并输出提示并直接读取字符。 这可以在sudo
源文件中的tgetpass.c
文件中看到。
还有其他一些情况:
askpass
程序,例如在-A
参数中,该程序将被调用。 sudo
从stdin
读取,例如用-S
标志 – 它也会把提示写入stderr
。 MadHatter的答案适用于这种情况。 tty
sudoers
的visiblepw
标志控制), sudo
将报告错误: no tty present and no askpass program specified
sudo
将回退到使用stdin
和stderr
即使没有特别要求。 MadHatter的答案也适用于这里。 pipe道将sudo cat
的stdout连接到less
的stdin,所以sudo cat
的stdin不受影响,并且能够接收密码。
至于提示,就是sudo cat
的情况。 在bash中,尝试使用stdoutredirect
sudo cat /etc/resolv.conf |& less
看看反应有多不同。