2011-09-27 34 views
11

我創建一個腳本文件,程序,並調用psftp.exe如下:如何通過價值PSFTP提示

psftp [email protected] -pw password -b psftpscript.txt 

,但它提示用戶輸入

服務器的主機密鑰不在緩存註冊表。您沒有 保證服務器是您認爲它的計算機。 服務器的rsa2密鑰指紋爲:[ssh-rsa 1024 somekey] 如果您信任此主機,請輸入「y」將密鑰添加到PuTTY的緩存中並進行連接 。如果您只想繼續連接一次,而沒有 將密鑰添加到緩存中,請輸入「n」。如果您不信任此主機,請按回車鍵放棄連接。將密鑰存儲在緩存中? (y/n)

我需要它是完全免提的,自動的。 我嘗試了批量參數,但它只是放棄連接

回答

-2

我最終通過在提示中輸入'y'來添加緩存的密鑰。我只需要做一次,之後再沒有提示,它的效果很好。

+1

-1:這不是完全自動的:提示示出第一次的連接被打開。如果有人碰巧清除緩存,您的程序將中斷。依靠這不發生是不好的! – ya23

3

您可以創建一個包含文件作爲輸入,只是唉,然後回車從http://www.sqlservercentral.com/Forums/Topic281954-9-1.aspx運行

psftp [email protected] -pw password -b psftpscript.txt < filename.txt 

感謝詹姆斯這樣一個簡單的解決方案

+0

不要建議任何人盲目接受SSH服務器的主機密鑰而不解釋安全後果!您通過這樣做會失去對[MITM攻擊](https://en.wikipedia.org/wiki/Man-in-the-middle_attack)的保護。 –

2

在.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(); 
+0

+1:很好的答案,限於.NET,但很有用。 – ya23

+0

不要建議任何人盲目接受SSH服務器的主機密鑰而不解釋安全後果!您通過這樣做會失去對[MITM攻擊](https://en.wikipedia.org/wiki/Man-in-the-middle_attack)的保護。 –

+0

@MartinPrikryl - 雖然你對此完全正確,但是你的評論不應該出現在問題中嗎?這不正是提問者所要求的嗎? – FuzzyAmi

21

我有同樣的問題與運行Windows Server 2008中的「沙箱」一個無人值守的腳本一樣的環境。我結束了運行的進入下面的y在提示您:

echo y | psftp [email protected] -l username -pw password -b psftpscript.txt 

希望這有助於!

注意:我只需要運行echo y一次,在第二次運行時刪除它並不要求密鑰被緩存。

+13

注意:如果你迴應'n',你會得到更一致的行爲。您仍將繼續連接,但密鑰不會被緩存。它會每次都會問你。 –

+2

按預期工作,無需用戶交互即可上傳文件。我甚至在接受密鑰後進行手動測試。腳本文件「echo n | psftp.exe ...」仍然有效。 – Whome

+0

如果我在調用psftp之前的批處理(.bat)文件中有回顯命令,那麼對我來說沒有效果。我從命令提示符運行.bat。 – VISQL

0

這並不直接回答你的問題,但提供了一個可能的解決方法:

啓動命令提示符誰將會運行腳本和用戶手工接受證書。然後在未來的連接,你不會有問題。

鑑於您的需要,超出了上述內容,這可能會也可能不適用。我帶着同樣的問題來到這個問題上,最終用我剛剛描述的方法解決了這個問題。

8

當您第一次運行它時,它會向您顯示您的服務器密鑰。 複製鍵,然後在命令行上,指定你這樣的主機密鑰:

psftp yourhostAddress -hostkey 06:15:d4:3b:e4:e8:23:c0:d6:6d:45:47:7e:bd:8d:74 -l yourusername -pw yourpassword -batch

+0

'-hostkey'不是有效的參數。這對'-i'不起作用,仍然要求輸入y/n。 – niksofteng

+0

@NikhilVartak hostkey在2014年被添加到膩子中。您運行的是什麼版本的膩子? –

1

我有,我沒有刪除權限的問題\在遠程服務器和重命名文件文件包含時間戳。 所以我需要按名稱下載文件。 psftp無法接受參數(或者我知道的任何方式),並且我無法根據當前日期動態更改文件名。

因此,從我打電話給psftp命令的批處理文件中,我動態創建了命令,並且使用帶有相關時間戳的文件創建了這些命令。 我只能複製今天比較好的文件,然後每次都複製一切。

cd "C:\CX\FTP\IG\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 [email protected] -b C:\SFTP\temp.txt 
close 
exit 

「echo cd出站> 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 [email protected] -b C:\ SFTP \ temp.txt「執行它。

作爲結果TEMP.TXT看起來像這樣:

cd outbound 
mget file_20151008*.csv 
quit 
close