
基本上,我想記錄透過伺服器上的 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,您可以使用三種方法:
研究替代(換句話說,商業)SSH/SFTP/SCP 伺服器。它們通常應該支援日誌檔案傳輸。
scp
將伺服器上的實用程式替換為記錄所需資料的實用程式。 OpenSSH 是開源的。知道如何在 Unix 上用 C 語言程式設計的人可以下載原始碼並修改它。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)