Kar*_*rlo 25 linux terminal sudo file-descriptors
如果我做:
sudo cat /etc/resolv.conf | less
Run Code Online (Sandbox Code Playgroud)
它会提示我输入密码,即使less(大概)需要stdin。在什么 fd 上显示密码提示以及它如何取回输入?
Bob*_*Bob 48
实际上,典型的 调用sudo
根本不读取密码stdin
。相反,sudo
将直接访问控制终端(atty
或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 的回答也适用于此。Mad*_*ter 10
管道将sudo cat
的标准输出连接到less
标准输入,因此sudo cat
标准输入不受影响,并且能够接收密码。
至于提示,它在sudo cat
的 stderr上熄灭;在 bash 中,尝试将其与 stdout 一起重定向,使用
sudo cat /etc/resolv.conf |& less
Run Code Online (Sandbox Code Playgroud)
看看反应有多么不同。