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

时间:2017-05-31 10:35:13

标签: ssh putty

我们是否可以选择PuTTY命令行将RSA hostkey作为类似于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执行此任务是一个不好的选择。

有兴趣了解整个背景的人的详细说明:

  • 我开发了一个Django应用程序来启动一些远程脚本 并完成任务。这使用putty ssh来运行命令 后台使用子进程模块,参数从中传递 Djangofront结束。

    我面临的问题是,有多个用户会使用它 应用程序启动他们的脚本。他们只有要求 在配置文件上存储服务器的IP地址和RSA密钥 Django Server。

    由于所有服务器都使用RSA密钥,因此首次登录时会要求 确认RSA指纹存储提示。

    通常当我们从本地机器手动启动时,我们会给出 是的,这是第一次。以及随后的运行它不会要求 确认。

    由于这些脚本将从用户的DjangoServer运行 无法访问,有没有办法我仍然可以运行 使用putty的远程脚本?

    请注意我知道使用WinSCP启动脚本但是 不幸的是,在我们的环境中,我无法启动脚本 WinSCP,但我可以使用WinSCP FTP,我使用hostkey选项 没有提示确认

2 个答案:

答案 0 :(得分:2)

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

this answer to a similar question on ServerFault中描述了一种方法。根据您是否希望将密钥添加到注册表中的缓存,回显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可以将OpenSSHknown_hosts格式的密钥转换为注册表文件,如果您不想手动打开会话并验证指纹,可以在Windows上导入该文件。

  • 在运行plink时提供服务器主机密钥的指纹:

    $user   = 'USERNAME'
    $server = 'HOSTNAME'
    $cmd    = 'COMMANDLINE'
    $fpr    = 'fa:38:b6:f2:a3:...'
    plink -batch -hostkey $fpr -l $user $server $cmd
    

所有这些都假定您是通过安全通道获得了相关信息并正确地对其进行了验证。

答案 1 :(得分:1)

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