17

我正在以编程方式创建一个脚本文件并调用psftp.exe如下:

psftp user@hostname.com -pw password -b psftpscript.txt

但它会提示用户输入

服务器的主机密钥未缓存在注册表中。您无法保证服务器就是您认为的计算机。服务器的 rsa2 密钥指纹为: [ssh-rsa 1024 somekey] 如果您信任此主机,请输入“y”将密钥添加到 PuTTY 的缓存中并继续连接。如果您只想进行一次连接,而不将密钥添加到缓存中,请输入“n”。如果您不信任此主机,请按 Return 放弃连接。将密钥存储在缓存中?(是/否)

我需要它完全免费、自动。我尝试了 -batch 参数,但它只是放弃了连接

4

9 回答 9

26

在类似 Windows Server 2008 的“沙盒”环境中运行无人值守脚本时,我遇到了同样的问题。我最终运行了以下命令,它会y在提示符处为您输入:

echo y | psftp user@hostname.com -l username -pw password -b psftpscript.txt

希望这可以帮助!

注意:我只需要运行一次 echo y 并在第二次运行时将其删除并不再要求缓存密钥。

于 2013-01-21T20:49:44.930 回答
17

当您第一次运行它时,它会显示您的服务器密钥。复制密钥,然后在命令行上指定主机密钥,如下所示:

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
于 2015-05-21T15:53:03.217 回答
2

您可以创建一个文件作为仅包含 ay 和回车符的输入,然后运行

psftp user@hostname.com -pw password -b psftpscript.txt < filename.txt

感谢来自http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx的 James提供了如此简单的解决方案

于 2012-06-26T15:55:52.680 回答
2

这不会直接回答您的问题,但提供了一种可能的解决方法:

以将运行您的脚本并手动接受证书的用户身份启动命令提示符。然后在将来的连接中,您将不会遇到问题。

鉴于您的需要,超出了已说明的范围,这可能有效,也可能无效。我遇到了同样的问题,并最终使用我刚刚描述的方法解决了这个问题。

于 2014-11-12T14:01:06.437 回答
1

在 .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();
于 2012-07-01T12:34:47.920 回答
1

我遇到的问题是我没有权限在远程服务器上删除\重命名文件并且文件包含时间戳。所以我需要按名称下载文件。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 
于 2015-10-11T05:29:50.717 回答
0

我最终通过在提示中输入“y”将密钥添加到缓存中。我只需要做一次,之后就没有提示了,效果很好。

于 2011-09-30T18:35:31.677 回答
-1

我认为你的命令行有问题。

Usage: psftp [options] [user@]host

尝试:

psftp -pw password -b psftpscript.txt user@hostname.com
于 2013-02-26T11:26:02.247 回答
-1

以上建议都不适合我,但我确实想出了一些对我有用的东西。

我在批处理文件中创建了 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



于 2020-10-08T00:40:25.550 回答