当ssh hostname
提示
The authenticity of host 'foobar' can't be established.
ECDSA key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?
我很想知道命令的原因:
yes yes | ssh hostname
不能自动回答这个问题的答案。提示仍然出现并等待stdin的输入。不应该"是"从yes
程序的stdout发送到ssh
程序的stdin?我想更深入地了解这里发生的事情以及为什么这样做不起作用。
为了澄清,我对实际解决绕过提示的问题不感兴趣。我纯粹有兴趣理解为什么,从根本上说,这不起作用。可能我完全误解了作品的标准,我想了解实际发生的事情。
答案 0 :(得分:5)
标准输入和交互式终端键盘输入之间存在差异。这也是您无法将密码回显给sudo提示的原因。
当您从标准输入读取内容时,它们将从文件描述符0(通常的数据管道或键盘输入)中读取。在终端输入的情况下,您真正与您的伪终端设备(pty / X)通话。这是一个很好的拆分,因为您可以执行cat some_file | ssh hostname
之类的操作并知道它作为数据发送。您不必关心身份验证机制,它可以在途中向您提出许多不同的问题。同样的事情适用于cat some_data | sudo command
- 您不希望将数据视为您的密码,因为您甚至不知道您是否会被要求提供。您也可以在不将它们回传给用户的情况下阅读。
对于一般的伪终端信息,请查看https://en.wikipedia.org/wiki/Pseudoterminal或https://unix.stackexchange.com/questions/21147/what-are-pseudo-terminals-pty-tty
如果您想以这种方式与ssh交互,则需要使用(例如)expect。或者,可以直接将签名附加到known_hosts(ssh-keyscan会为您提供正确的行),或者使用ssh -o StrictHostKeyChecking=no,UserKnownHostsFile=/dev/null hostname
。
从安全的角度来看,这些都是可怕的想法。如果您想摆脱最初的问题,可以publish the key in dns或使用host certificates。
答案 1 :(得分:0)
只是为了澄清一点点。从终端读取与身份验证相关的交互式内容不是“你”,而是DATETIME2(3)
程序。
它还会读取ssh
并将其转发到远程计算机上运行的程序,允许这样的技巧:
STDIN
即使ssh需要向您提出相关问题,也会有效。