如何取得遠端伺服器上的scp日誌

如何取得遠端伺服器上的scp日誌

基本上,我想記錄透過伺服器上的 SCP 發送或接收的每個檔案。

假設使用者執行從 Server-1 到 Server-2 的 SCP。我找到了在發送方獲取日誌的方法,但接收方如何取得傳輸的內容呢?

我想要接收方的日誌包含透過 SCP 傳輸到它的檔案的名稱。

另外,為了取得發送方的日誌,我使用了 bash 腳本,該腳本首先將檔案名稱儲存到日誌檔案中,然後使用 SCP 傳輸它。有沒有更好的方法來做到這一點。

預先感謝您的任何建議。

答案1

我剛剛發現了一個其他人可能感興趣的有趣解決方案:

使用時,scp它實際上也會使用該標誌來呼叫伺服器上的二進位-f。這意味著可以為伺服器端編寫一個簡單的包裝器scp,如下所示:

首先更改您原來的scp名稱:

mv /usr/bin/scp /usr/bin/scp-org

然後以其名稱創建一個簡單的腳本:

sudo nano /usr/bin/scp

內容:

#/bin/bash

scp-org $@ | tee >(grep -aEo "[CD][0-7]{4} [0-9]* .*$" --line-buffered >> /var/log/scp.log)

這當然可以改進,但它只是一個例子。現在您可以使用tail -f /var/log/scp.log並查看即時傳輸的所有文件

答案2

您可以嘗試將scp伺服器上的命令替換為滿足您需求的修改版本。scp是一個非常簡單的程序,在其中添加一些日誌記錄程式碼不應該是一項艱鉅的任務。

答案3

您可能正在使用 OpenSSH 軟體套件。 OpenSSHscp實用程式不記錄任何內容。它支援底層 SSH 會話的偵錯輸出,但不會記錄正在發生的實際檔案傳輸。

類似地,OpenSSH 伺服器可以設定為記錄有關其正在執行的操作的詳細信息,並且可以設定為記錄使用者連接並運行的事實scp,但它不會記錄正在發生的實際檔案傳輸。

如果您無法讓這些使用者改用 SFTP,您可以使用三種方法:

  1. 研究替代(換句話說,商業)SSH/SFTP/SCP 伺服器。它們通常應該支援日誌檔案傳輸。

  2. scp將伺服器上的實用程式替換為記錄所需資料的實用程式。 OpenSSH 是開源的。知道如何在 Unix 上用 C 語言程式設計的人可以下載原始碼並修改它。

  3. scp用啟動原始 scp 程式並監視其功能的「包裝器」來取代該實用程式。 Unix 有一些偵錯工具可以監視另一個進程正在做什麼。

我需要記錄scp一次傳輸,所以我使用了第三種方法。我寫了一個 Perl 腳本,在下面啟動了原始的 scp 程式斯特雷斯。 Strace 將輸出 scp 程序開啟和關閉的檔案的名稱。 Perl 腳本解析 strace 輸出並找出正在傳輸的檔案。

答案4

我相信建議在伺服器上對二進位檔案進行包裝的解決方案scp不適用於最近的scp客戶端。

Since OpenSSH 8.8 (8.7 in Red Hat/Fedora builds), scp has use the SFTP protocol for transfers by default.

scp對於此類較新的客戶端,這種在伺服器上包裝的機制僅在客戶端scp使用該-O標誌呼叫時才有效(以強制執行舊協定)。

對於這樣的需求,也許使用rsync而不是scp可以幫助?rsync似乎有記錄文件存取的能力:來自rsyncd.conf手冊頁:

log format
This parameter allows you to specify the format used for logging file transfers when transfer logging is enabled.
[..]
%f the filename (long form on sender; no trailing lq/rq)

相關內容