响应 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 的内置输入重定向 - 而不是 &lt; 运算符。现在的代码如下所示:

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 主机密钥提示的主要内容,如果未能解决你的问题,请参考以下文章

linux_密钥

scp时需要输入目标主机密码的问题

scp时需要输入目标主机密码的问题

SaltStack salt-key 命令

使用密钥解决scp命令需要输入密码问题

ATSHA204加密芯片介绍