2013-10-07 66 views
1

我用paramiko.SFTP對象的getput方法。我依稀記得我確實有時會感到與get方法不完整的文件內容,但從來沒有發現任何問題與put。這只是我的運氣,還是應該執行額外的檢查以確保我在遠程端獲得正確的文件?如果是這樣,我該怎麼做,因爲我只有SFTP訪問該遠程服務器?是否paramiko文件傳輸操作原子?

通過SFTP進行只讀訪問,我的意思是我不能SSH在:

$ ssh [email protected] 
[email protected]'s password: 
PTY allocation request failed on channel 0 
shell request failed on channel 0 
+1

我用'put'一天多次,我看到文件總是到達遠程端。但是如果你想確保使用'ssh.exec_command'併發送你想要的任何shell命令(例如簡單的'ls')。 – Milo

+0

我的意思是文件內容,對不起。我更新了問題以澄清。另外請注意,我沒有對服務器的'exec_command'訪問權限。 – Tshepang

+0

因此無法通過SSH連接到服務器? – Milo

回答

1

您可以相當肯定如果SFTP傳輸沒有錯誤或中斷完成後,該文件已被完全複製,因爲SFTP協議要求每個發送的塊被確認。因此,在TCP,SSH通道的可靠性和每個塊的ACK之間,該文件幾乎不可能以任何方式被截斷。

一對夫婦更多的事情只有使用SFTP時,你可以這樣做:

  • 轉讓後,您可以在文件中調用stat()來驗證它的實際大小。
  • 你可以讀迴文件的一個或多個數據塊並在本地進行比較。
  • 一些SFTP服務器有一個檢查的文件擴展名(我不認爲openssh的支持這雖然)。 Paramiko sftp文件有一個check()方法,可以讓你獲得部分或全部文件的散列。

並直接回答你的問題的標題,接送原子。該文件在寫入時仍然可以在系統上進行更改。如果您想防止這種情況發生,您可以遠程將文件寫入臨時位置,驗證它,然後調用sftp.rename將其移至最終目標(這是在同一文件系統中的Linux上的原子操作)。這大致類似於什麼rsync的呢,大概接近你可以到「原子」。