2017-05-08 191 views
3

cronjob每隔3小時運行一次使用SFTP下載文件。預定的程序是用Perl編寫的,使用的模塊是Net::SFTP::ForeignSFTP文件同時上傳和下載

能否Net::SFTP::Foreign下載文件僅部分使用SFTP上傳?

如果是這樣,我們需要檢查修改日期,檢查複製過程完成SFTP文件?

假設一個新的文件被人在SFTP上傳和他文件上傳/複製過程中。如果同時嘗試下載,是否需要編寫只讀取文件的一部分的可能性?

回答

2

這不是SFTP 客戶您使用的問題,這是無關緊要的。這就是SFTP 服務器如何處理這種情況。

一些SFTP服務器可能鎖定文件被上傳,導致您無法訪問它,而仍然被上傳它。但是大多數SFTP服務器,特別是常見的OpenSSH SFTP服務器,不會鎖定文件。

這個問題沒有通用的解決方案。檢查時間戳或大小更改可能適用於您,但它幾乎不可靠。

有一些常見的解決方法的問題:

  • 有上傳上傳「完成」文件上傳一次完成。讓你的程序等待「完成」文件出現。
  • 你可以有專門的「上傳」文件夾,並讓上傳者(自動)將上傳的文件移動到「完成」文件夾中。只讓你的程序看起來「完成」文件夾。
  • 對上傳的文件有一個文件命名約定(「.filepart」),並在上傳到其最終名稱後讓上傳器(自動)重命名該文件。讓你的程序忽略「.filepart」文件。
    有關實施此方法的示例,請參閱(我的)文章Locking files while uploading/Upload to temporary file name
  • 嚴重的黑客攻擊是定期檢查文件屬性(大小和時間),並考慮上傳完成,如果屬性在某段時間內沒有改變。

有關詳細信息,請參閱我對SFTP file lock mechanism的回答。

0

您可以檢查文件的大小。

  1. 連接到SFTP。
  2. 檢查文件大小。
  3. 睡眠5/10秒。
  4. 再次檢查文件大小。
  5. 如果大小沒有改變,下載文件,如果大小改變執行步驟3.
1

這樣做,當上傳過程也是你的操控下最簡單的方法,就是上傳使用時間名稱的文件(例如,foo-20170809.tgz.temp),一旦上傳完成,重命名然後(Net::SFTP::Foreign::put方法支持atomic選項,就是這樣做)。然後在下載端,用與時態文件相對應的名稱過濾出文件。

無論如何,Net::SFTP::Foreigngetrget方法可以被指示通過選項resume => 1恢復轉移。另外,如果你有完整的SSH訪問SFTP服務器,你可以使用fuser或類似的工具(儘管如此,請注意,即使這樣,文件可能仍然在寫入要下載的文件如果例如存在一些網絡問題並且上傳者在恢復傳輸之前需要重新連接),則不完整。