当我执行时:
ssh-keyscan -H 172.22.56.2
我得到以下输出:
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
如果我再尝试:
ssh-keyscan -H 172.22.56.2 >> ~/.ssh/known_hosts
不熟悉 ssh-keyscan 但相信我得到的输出..不是我想要的,我还尝试了 -t 的变体,例如:
ssh-keyscan -H -t rsa 172.22.56.2 >> ~/.ssh/known_hosts
所有的结果都是一样的。该文件的权限是:
-rw-r--r-- 1 username username 886
“用户名”是运行上述命令的用户名。这给我留下了以下问题:
- 我的 ssh-keyscan 输出传达/意思是什么?我希望这里有 |1|weofijgojw = sshkey 字符串。
- 为什么无论如何都没有写入 ~/.ssh/known_hosts ?没有任何迹象表明问题已反馈给我/命令需要
提前感谢您的任何见解!
更新 1:
user@hostname:~$ ssh [email protected]
Unable to negotiate with 172.22.56.2 port 22: no matching key exchange method found. Their offer: diffie-hellman-group1-sha1
user@hostname:~$ ssh [email protected] -oKexAlgorithms=+diffie-hellman-group1-sha1
Unable to negotiate with 172.22.56.2 port 22: no matching host key type found. Their offer: ssh-dss
user@hostname:~$ ssh [email protected] -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-dss
Unable to negotiate with 172.22.56.2 port 22: no matching cipher found. Their offer: 3des-cbc
user@hostname:~$ ssh [email protected] -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-dss -oCiphers=+3des-cbc
The authenticity of host '172.22.56.2 (172.22.56.2)' can't be established.
DSA key fingerprint is SHA256:HwdMfb3k5KwrwQkFIRe6ZXilbObYhNzLbwb0zvk2n8U.
Are you sure you want to continue connecting (yes/no/[fingerprint])? ^C
user@hostname:~$ ssh-keyscan -H 172.22.56.2
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
# 172.22.56.2:22 SSH-2.0-RomSShell_4.31
添加“-vv”仅适用于 ssh 应用程序,而不适用于 ssh-keyscan,所以我没有从中找到任何有用的东西。
从技术上讲,最初提出的问题得到了回答,但这更多是因为我对调查缺乏完整的愿景——在这一点上,真正的问题似乎是:
- 当 ssh 到同一主机产生 SSH 密钥提示时,为什么 ssh-keyscan 不返回任何结果?
我应该打开一个新问题还是只是更改我原来的提交?谢谢!
(来自评论加更新)
问题是目标设备真的很糟糕,而且显然(由 诊断
ssh
)只支持最近的 OpenSSH 不喜欢的旧且大部分过时的 SSH 选项。首先,它只有一个 DSA(在 SSH 中也拼写为 DSS)密钥。
ssh-keyscan
默认情况下从未请求过 DSA 密钥,尽管它请求的类型集有所不同,并且主要包括添加的其他新类型;这就是为什么在没有选项的情况下运行它会显示 5 次尝试——获取设备没有的密钥类型。这部分可以通过指定来修复-t dsa
。其次,它只支持用于 KEX 的 DH 组 1 和用于加密的 3des-cbc。尽管
ssh
不再认为组 1 是安全的并且需要-oKexAlgorithms=
使用它的选项,但ssh-keyscan
强制使用看起来像所有KEX 组的内容。但是,它不会更改ssh
密码的默认设置,因此ssh-keyscan
在 OpenSSH 7.4 中应该仍然失败。如果你降级到 7.4 以下,我相信ssh-keyscan -t dsa
会起作用。当然,降级对安全性不利,因此您应该只在临时猴子上执行此操作,例如随后丢弃的虚拟机或容器。或者,正如您所发现的,
ssh
可以为-o
接受这些旧选项提供选项,因此它可以获取主机密钥并将其添加到known_hosts
. 如果您只是为了避免交互,即自动化,请使用-oStrictHostKeyChecking=no
(或accept-new
在 7.6 中)在没有提示的情况下执行此操作。如果您不希望将新密钥直接放在文件中,也-oUserKnownHostsFile=
可以将其放在其他地方——尽管一旦你这样做了,对新文件唯一可能做的事情就是将它添加到known_hosts
就像ssh
会有的,那何必呢?