ssh-keyscan 到 known_hosts 没有产生结果

ssh-keyscan 到 known_hosts 没有产生结果

当我执行:

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

“用户名”是运行上述命令的用户名。这让我产生了以下疑问:

  1. 我的 ssh-keyscan 输出通信/含义是什么?我期望这里有类似 |1|weofijgojw = sshkey 字符串的内容。
  2. 为什么无论如何都没有写入 ~/.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本来会做的那样,所以何必呢?

相关内容