我的设置如下:
- 节点
A
是我开始的地方 - 节点
B
是网关机器 - 节点
C
是目的地。
从A
到B
我已经设置了 SSH 公钥身份验证,但从B
到C
我不被允许这样做。
因此,从节点A
我使用以下咒语,它实际上可以在不同的计算机(Ubuntu 14.04)上运行:
sshpass -p secretpass ssh -oProxyCommand="ssh -W %h:%p username@B" username@C
…然而,当我尝试从另一个位置使用另一台机器(Ubuntu 16.04 - 尽管我怀疑这是否相关)时,调用sshpass
立即返回,没有任何类型的输出和退出代码(通过 获得echo $?
)为 6。
更令人费解的是,如果我单独执行这些步骤,它们就会成功:
A: $ ssh username@B (directly access B without being prompted for password)
B: $ ssh username@C (prompted for password, provided 'secretpass')
C: $ (reached my destination)
答案1
好的,所以我知道出了什么问题了。由于我是第一次在这台机器上使用此脚本,因此我必须首先执行以下操作(不带sshpass
):
ssh -oProxyCommand="ssh -W %h:%p username@B" username@C
然后我被提示:
无法确定主机“C <没有用于代理命令的主机IP>)”的真实性。
RSA 密钥指纹是 SHA256:...。
您确定要继续连接吗(是/否)?是的
警告:已将“C”(RSA) 永久添加到已知主机列表中
……一旦我接受了上述内容,我就能够使用我在问题中询问的咒语,而不会出现进一步的问题。
所以这次失败是因为咒文无法回答只出现一次的真伪提示。
sshpass
从(返回值部分)的手册页:
与任何其他程序一样,sshpass 在成功时返回 0。如果失败,则使用以下返回代码:
[...]
6
主机公钥未知。 sshpass 退出而不确认新密钥。
答案2
如果您需要在第一次不接受指纹的情况下使其工作,您可以使用:
ssh ... -o "StrictHostKeyChecking=no"