响应 y(es) 到 psftp 主机密钥提示
Posted
技术标签:
【中文标题】响应 y(es) 到 psftp 主机密钥提示【英文标题】:Respond y(es) to psftp host key prompt 【发布时间】:2011-11-26 11:06:18 【问题描述】:我正在以编程方式创建一个脚本文件并调用psftp.exe
,如下所示:
psftp user@hostname.com -pw password -b psftpscript.txt
但它会提示用户输入
服务器的主机密钥未缓存在注册表中。你没有 保证服务器是您认为的计算机。这 服务器的 rsa2 密钥指纹是:[ssh-rsa 1024 somekey] 如果你相信这个 主机,输入“y”将密钥添加到PuTTY的缓存并继续 连接。如果您只想进行一次连接,无需 将密钥添加到缓存中,输入“n”。如果您不信任此主机, 按 Return 放弃连接。将密钥存储在缓存中? (是/否)
我需要它是完全免费的、自动的。 我尝试了 -batch 参数,但它只是放弃了连接
【问题讨论】:
【参考方案1】:在类似 Windows Server 2008 的“沙盒”环境中运行无人参与的脚本时,我遇到了同样的问题。我最终运行了以下命令,在提示符处为您输入y
:
echo y | psftp user@hostname.com -l username -pw password -b psftpscript.txt
希望这会有所帮助!
注意:我只需要运行一次 echo y 并在第二次运行时将其删除并不再要求缓存密钥。
【讨论】:
注意:如果你回显n
,你会得到更一致的行为。您仍将继续连接,但不会缓存密钥。它每次都会问你。
按预期工作,无需用户交互即可不间断地上传文件。我什至在接受密钥后手动测试。脚本文件“echo n | psftp.exe ...”仍然有效。
如果我在调用 psftp 之前的批处理 (.bat) 文件中有该 echo 命令,则对我不起作用。我从命令提示符运行 .bat。
这个解决方案首先跳过了密钥提供的安全性。请参阅@ReeveStrife 的答案以获得最佳解决方案。
不建议任何人盲目接受SSH服务器的主机密钥而不解释安全后果!这样做会失去对MITM attacks 的保护。【参考方案2】:
当您第一次运行它时,它会显示您的服务器密钥。 复制密钥,然后在命令行中指定主机密钥,如下所示:
psftp example.com -hostkey 06:15:d4:3b:e4:e8:23:c0:d6:6d:45:47:7e:bd:8d:74 -l yourusername -pw yourpassword -batch
【讨论】:
【参考方案3】:你可以创建一个文件作为输入,只包含一个 y 和回车然后运行
psftp user@hostname.com -pw password -b psftpscript.txt < filename.txt
感谢 http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx 的 James 提供如此简单的解决方案
【讨论】:
不建议任何人盲目接受SSH服务器的主机密钥而不解释安全后果!这样做会失去对MITM attacks 的保护。【参考方案4】:这不会直接回答您的问题,但提供了一种可能的解决方法:
以运行脚本并手动接受证书的用户身份启动命令提示符。然后在将来的连接中,您将不会遇到问题。
根据您的需要,超出已说明的范围,这可能会或可能不会起作用。我遇到了同样的问题,并最终使用我刚刚描述的方法解决了这个问题。
【讨论】:
【参考方案5】:在.Net 中,我发现上述方法并没有达到预期的效果。诀窍是使用 .Net 的内置输入重定向 - 而不是 <
运算符。现在的代码如下所示:
System.Diagnostics.Process proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.FileName = "c:\\psftp.exe";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardInput = true;
proc.StartInfo.Arguments = strIP + " -v -l " + strUsername + " -pw " + strPassword + " -b " + strBatchFilename;
proc.Start();
StreamWriter myStreamWriter = proc.StandardInput;
myStreamWriter.WriteLine("Y\n"); //override the public key question <---
myStreamWriter.Close();
proc.WaitForExit();
proc.Close();
【讨论】:
不建议任何人盲目接受SSH服务器的主机密钥而不解释安全后果!这样做会失去对MITM attacks 的保护。 @MartinPrikryl - 虽然您对此完全正确,但您的评论不应该出现在问题中吗?这不正是提问者所要求的吗? OP 要求 "prompt free" 解决方案。正如@Gerrie's answer 所示,有一个快速免费的解决方案,仍然安全。【参考方案6】:我没有权限在远程服务器上删除\重命名文件并且文件包含时间戳。 所以我需要按名称下载文件。 psftp 无法接受参数(或我知道的任何方式),我无法根据当前日期动态更改文件名。
因此,从我调用 psftp 命令的批处理文件中,我动态地创建了命令,并使用带有相关时间戳的文件。 我只能复制今天的文件,这比每次都复制更好。
cd "C:\Files"
echo cd outbound > C:\SFTP\temp.txt
echo mget file_%date:~10,4%%date:~4,2%%date:~7,2%*.csv >> C:\SFTP\temp.txt
echo quit >> C:\SFTP\temp.txt
echo close >> C:\SFTP\temp.txt
C:\SFTP\psftp user@ftp.address.com -b C:\SFTP\temp.txt
close
exit
“echo cd outbound > C:\SFTP\temp.txt”清理旧文件并开始写入新文件的内容。 “echo mget file_%date:~10,4%%date:~4,2%%date:~7,2%.csv >> C:\SFTP\temp.txt”导致创建命令:“mget file_20151008.csv”,它下载所有以“file_20151008...”开头的文件,接下来的 2 行刚刚结束操作,“C:\SFTP\psftp user@ftp.address.com”行-b C:\SFTP\temp.txt" 执行。
结果 temp.txt 如下所示:
cd outbound
mget file_20151008*.csv
quit
close
【讨论】:
【参考方案7】:我最终通过在提示符中输入“y”将密钥添加到缓存中。我只需要执行一次,之后不再提示,效果很好。
【讨论】:
-1:这不是全自动的:第一次打开连接时会显示提示。如果有人碰巧清除了缓存,你的程序就会中断。依靠这不发生是不好的! @ya23 验证主机密钥必须是手动过程。试图自动化是不好的!在@Gerrie 的回答中看到使用-hostkey
开关绝对比缓存密钥更好。但是这个答案仍然比大多数其他盲目接受任何主机密钥的答案更好。【参考方案8】:
我认为你的命令行有问题。
Usage: psftp [options] [user@]host
试试:
psftp -pw password -b psftpscript.txt user@hostname.com
【讨论】:
【参考方案9】:以上建议都不适合我,但我确实想出了一些对我有用的东西。
我在批处理文件中创建了 2 个条目以使其正常工作。 第一项导致连接缓存在注册表中。 第二个条目将自动连接,因为现在主机密钥已缓存在注册表中。
echo y | psftp.exe username@hostname.com -pw password
psftp.exe username@hostname.com -pw password -v -be -batch -b psftp_upload_command.bat
【讨论】:
以上是关于响应 y(es) 到 psftp 主机密钥提示的主要内容,如果未能解决你的问题,请参考以下文章