题 为什么密码输入在管道sudo命令中工作?


如果我做:

sudo cat /etc/resolv.conf | less

它会提示我输入密码,即使较少(可能)需要密码。什么fd是显示的密码提示,它是如何获得输入的?


24
2017-10-27 08:31






答案:


实际上,一个典型的调用 sudo 不读取密码 stdin 一点都不代替, sudo 将直接访问控制终端(a tty 要么 pty,通过 /dev/tty 特殊文件)并直接输出提示和读取字符。这可以在 tgetpass.c 文件中 sudo 资源。

还有一些其他方案:

  • 如果 askpass 程序是指定的,例如在里面 -A param,该程序将被调用。
  • 否则,如果您特别要求 sudo 阅读 stdin,例如随着 -S 标志 - 它也会写提示符 stderr。这就是这种情况 MadHatter的回答 适用。
  • 否则,如果没有 tty 可得到
    • 如果禁用密码回显(默认情况下,由...控制) visiblepw 国旗 sudoerssudo 将报告错误: no tty present and no askpass program specified
    • 除此以外, sudo 将回归使用 stdin 和 stderr 即使没有特别要求。 MadHatter的回答 也适用于此。

47
2017-10-27 12:55





管道连接 sudo cat的标准是 less的斯坦丁,所以 sudo cat的标准输入不受影响,能够接收密码。

至于提示,它就会消失 sudo cat的stderr;在bash中,尝试使用stdout重定向它

sudo cat /etc/resolv.conf |& less

并看看响应有多么不同。


10
2017-10-27 08:37



虽然这个答案是正确的 sudo的stdin仍然使用example命令连接到终端,这与它获取密码的方式没有直接关系:默认情况下 sudo 不会通过stdin请求密码,也不会显示提示通过 stderr  - 你可以试试 2>/dev/null 确认一下。代替, sudo 直接访问tty。 - Bob