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 specifiedsudo将回退到使用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)
看看反应有多么不同。
| 归档时间: |
|
| 查看次数: |
3097 次 |
| 最近记录: |