为什么在管道式sudo命令中输入密码有效?


25

如果我做:

sudo cat /etc/resolv.conf | less

它会提示我输入密码,即使花费更少(大概)需要stdin。在什么fd上显示密码提示,密码提示如何取回输入?

Answers:


48

实际上,典型的调用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 specified
    • 否则,sudo将回退到使用stdinstderr即使它没有特别要求。MadHatter的答案也将在此处适用。

10

管道将sudo cat的stdout 连接到less的stdin,因此sudo cat的stdin不受影响,并且能够接收密码。

至于提示,它在sudo cat的stderr 上熄灭;在bash中,尝试使用stdout将其重定向,使用

sudo cat /etc/resolv.conf |& less

并查看响应有何不同。


16
尽管此答案是正确的,因为sudostdin仍通过example命令连接到终端,但这与获取密码的方式没有直接关系:默认情况下,它sudo不会通过stdin请求密码,也不会通过stderr-您显示提示可以尝试2>/dev/null确认一下。而是sudo直接访问tty。
鲍勃
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.