我可以将服务器的 RSA 主机密钥作为 PuTTY 命令行选项传递吗?

Can I pass RSA hostkey of server as PuTTY command line option?

我们在 PuTTY 命令行上是否有选项将 RSA 主机密钥作为参数发送,类似于 WinSCP -hostkey。?

当前使用的 PuTTY 命令:

putty.exe -ssh -l username -pw password -m command.txt RemoteServerIP

是否有类似 WinSCP 的选项,可以像下面那样传递 RSA 主机密钥:

open sftp://username :password@RemoteServerIP/ -hostkey="ssh-rsa 2048 11:2c:5d:f5:22:22:ab:12:3a:be:37:1c:cd:f6:13:d1"

另外让我知道,如果我选择使用 PuTTY 执行此任务是一个错误的选择。


有兴趣了解整个背景的详细解释:

PuTTY 也 has -hostkey switch,只是语法略有不同:

-hostkey 11:2c:5d:f5:22:22:ab:12:3a:be:37:1c:cd:f6:13:d1

事实上,PuTTY 并不是自动执行命令的正确工具。

而是使用 Plink (PuTTY command-line connection tool):

plink.exe -ssh -l username -pw password -hostkey aa:bb:cc:... hostname command

有几种方法可以处理 SSH/SCP/SFTP 主机密钥验证。

this answer to a similar question on ServerFault 中描述了一种方法。 Echo yn 取决于您是否希望将密钥添加到注册表的缓存中。重定向错误输出流以抑制通知消息。

echo 'y' | plink -l USERNAME HOSTNAME 'COMMANDLINE' 2>$null   # cache host key
echo 'n' | plink -l USERNAME HOSTNAME 'COMMANDLINE' 2>$null   # do not cache host key

但是请注意,如果您不想缓存密钥 并且 使用批处理模式,这将失败:

echo 'n' | plink -batch -l USERNAME HOSTNAME 'COMMANDLINE'   # this won't work!

但是请注意,此方法实质上禁用了主机密钥验证,该验证已到位以防止中间人攻击。也就是说,不推荐自动接受来自任意远程主机的主机密钥。

自动接受任意主机密钥的更好替代方案是:

  • 保存已验证主机密钥的 PuTTY 会话,以便您可以从 plink 重新使用它,如下所示:

    plink -load SESSION_NAME 'COMMANDLINE'
    
  • 在 运行 plink 之前在注册表中预缓存主机密钥。有一个 Python script 可以将 OpenSSH known_hosts 格式的密钥转换为注册表文件,如果您不想手动打开会话并验证指纹,则可以在 Windows 上导入该注册表文件.

  • 当运行 plink:

    时提供服务器主机密钥的指纹
    $user   = 'USERNAME'
    $server = 'HOSTNAME'
    $cmd    = 'COMMANDLINE'
    $fpr    = 'fa:38:b6:f2:a3:...'
    plink -batch -hostkey $fpr -l $user $server $cmd
    

当然,所有这些都假设您通过安全渠道获得了相关信息并进行了正确验证。