当我执行:
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 不返回任何结果?
我应该提出新问题还是只是修改我原来的提交内容?谢谢!
答案1
(来自评论和更新)
问题在于目标设备确实很差劲,并且显然(正如诊断的那样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
本来会做的那样,所以何必呢?