为什么没有"是的,是的ssh主机名"工作自动回答是以托管密钥身份验证?

时间:2015-11-18 04:41:36

标签: linux

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?我想更深入地了解这里发生的事情以及为什么这样做不起作用。

为了澄清,我对实际解决绕过提示的问题不感兴趣。我纯粹有兴趣理解为什么,从根本上说,这不起作用。可能我完全误解了作品的标准,我想了解实际发生的事情。

2 个答案:

答案 0 :(得分:5)

标准输入和交互式终端键盘输入之间存在差异。这也是您无法将密码回显给sudo提示的原因。

当您从标准输入读取内容时,它们将从文件描述符0(通常的数据管道或键盘输入)中读取。在终端输入的情况下,您真正​​与您的伪终端设备(pty / X)通话。这是一个很好的拆分,因为您可以执行cat some_file | ssh hostname之类的操作并知道它作为数据发送。您不必关心身份验证机制,它可以在途中向您提出许多不同的问题。同样的事情适用于cat some_data | sudo command - 您不希望将数据视为您的密码,因为您甚至不知道您是否会被要求提供。您也可以在不将它们回传给用户的情况下阅读。

对于一般的伪终端信息,请查看https://en.wikipedia.org/wiki/Pseudoterminalhttps://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需要向您提出相关问题,也会有效。