为什么我可以通过重定向输出看到密码提示?

Mat*_*ons 10 linux ssh redirection stderr stdout

所以,我有一个我发出的命令,它本质上是“ssh”到各种主机中:

 command 2&>1 | grep "desired output" 
Run Code Online (Sandbox Code Playgroud)

每隔一段时间,在命令执行过程中,它就会遇到一个我没有设置密钥的主机。发生这种情况时,我得到以下输出:

 Password: 
Run Code Online (Sandbox Code Playgroud)

由于我将 STDERR 重定向到 STDOUT,然后过滤 STDOUT 以只给我“所需的输出”(不包括“密码:”),密码提示是如何呈现给我的?

par*_*ydr 12

ssh 打开 /dev/tty 进行读写以提示输入密码。

我猜这是一个安全功能,输入必须来自 tty 而不是 stdin。

如果您运行strace ssh <host>strace 将向您显示该命令正在进行的系统调用。

我得到:

open("/dev/tty", O_RDWR|O_LARGEFILE)    = 4
...
write(4, "dave@host"..., 16dave's password: ) = 16
read(4,
Run Code Online (Sandbox Code Playgroud)

  • 根据我的理解,这也是为什么您不能简单地将密码从带有重定向的脚本传递给 ssh 的原因。你需要`expect`(http://expect.sourceforge.net,另见http://stackoverflow.com/questions/459182/using-expect-to-pass-a-password-to-ssh) (2认同)