透過 FTP 追蹤文件

透過 FTP 追蹤文件

我正在嘗試從 Windows 桌面存取遠端伺服器上的大型日誌檔案。我僅有的可以透過 FTP 存取此遠端計算機,但不能透過 SSH 存取。

目前,我正在使用 WinSCP 透過 FTP 取得整個檔案。這意味著我每次都必須傳輸完整的檔案。但是,鑑於它是一個日誌文件,我可能只需要最後幾行。

這尤其令人沮喪,因為我的頻寬受到嚴重限制,因此傳輸整個檔案需要幾分鐘。

tail -100如果我有 shell 存取權限,那麼可以透過使用諸如獲取最後 100 行之類的方法來輕鬆實現這一點。

我想找到一個透過 FTP 執行此操作的解決方案。請注意,它不必是連續的尾部,只需一次性就足夠了。

答案1

你想做的事,絕對可以用FTP來完成。從技術上講,任何 FTP 用戶端在復原中斷的檔案下載時所做的操作都是相同的。

儘管從使用者的角度來看,我不知道是否有任何 FTP 用戶端支援僅明確下載給定數量的尾隨位元組。

但某些 FTP 用戶端肯定允許您下載先前下載的檔案的新尾隨內容。

特別是對於 WinSCP,只需啟動日誌檔案下載即可。然後,在覆蓋確認提示,選擇恢復(它在下拉式選單中按鈕)。請注意,僅當來源檔案大於目標檔案時,該選項顯然才可用。

如果您確實只想下載日誌的最後幾行,則可以透過在開始下載之前建立比日誌檔案小一點的虛擬本機檔案來欺騙 WinSCP。

您也可以輕鬆自動化上述技巧:

fsutil file createnew mylog.log 100000000
winscp.com /command "open mysession" "get -resume /path_to_log/mylog.log" "exit"

有關 的替代方案fsutil,請參閱在Windows系統上快速建立大檔案?

透過更多努力,您可以修改腳本以首先檢查日誌檔案大小並自動計算比日誌大小小數千位元組的虛擬檔案大小。

答案2

我不知道如何使用 WinSCP 來做到這一點,實際上這可能是不可能的,但一般來說,您應該能夠使用休息命令。看RFC 3659。不過,我不清楚您是否可以從文件末尾開始下載,或者您是否需要已經收到標記。 RFC 3659 顯示這是可能的,至少在 STREAM 模式下是如此:

即使除了資料本身之外沒有傳輸任何重新啟動標記,使用 FILE STRUcture 的 STREAM 模式傳輸也可能會重新啟動。這是透過使用 SIZE 命令(如果需要)結合 RESTART (REST) 命令和標準檔案傳輸命令之一來完成的。

答案3

我沒有聽說有任何軟體可以滿足您的需求。但如果你是程式設計師,你應該了解如何用 Perl 寫這個。

在這裡我找到瞭如何獲取所有文件的範例。這不是您的決心,但它可以幫助您了解如何做: http://www.perlmonks.org/?node_id=907019

另一個,Net::FTP 函式庫的幫助: http://search.cpan.org/dist/libnet/Net/FTP.pm

使用它,您可以打開到伺服器的 ftp 連接(第一個範例)進行授權(第一個範例)

第二個URL 幫助您如何使用方法取得檔案的最後部分: ->ascii 將傳輸模式設為ascii,因為這是日誌檔案->size ( FILE ) 取得檔案大小以計算應該從哪裡開始->restart ( WHERE ) 設定檔案遊標從檔案中要開始讀取的位置 ->read ( BUFFER, SIZE [, TIMEOUT ] ) 直接將小 SIZE 部分讀取到 BUFFER 變數中

另一個函數:length(BUFFER) 告訴你獲得了多少資料。如果它為零,則您可能已達到 EOF print ("$BUFFER\n") 簡單列印緩衝區內容到螢幕

請注意,這並不是完全的解決方案,而是如何做的方法。我寫這一切的唯一原因是可能沒有適合您任務的軟體。

如果您不知道如何編寫該程序,只需在 stackoverflow.com 上詢問,而不是超級用戶。有許多程式設計師隨時準備尋求協助。

如果可能,請檢查您的 ftp 網站是否支援恢復下載。如果沒有這個讀取檔案結束部分是不可能的。

另一個部分解決方案可能是日誌檔案輪換,每天或一小時一個檔案。這取決於日誌檔案增長的速度。

相關內容