Ssh

如何使用 OpenSSH SFTP 伺服器檢測或記錄中斷的上傳?

  • December 25, 2014

我有這個問題,我們的客戶一直在 SFTP-ing 截斷數據。我不確定問題出在我們這邊還是他那邊。我啟用了 SFTP 日誌記錄,但它不允許我檢測上傳是否被中斷。

例如,如果我啟動 sftp 客戶端,並^C在上傳過程中點擊,伺服器只會說類似 的close "/data/README.md" bytes read 0 written 5366內容,這與不間斷上傳無法區分。

.part想像前綴這樣的東西會起作用,但是通過查看有關伺服器故障的其他文章,我認為 OpenSSH 的 sftp 伺服器不可能。

那麼,有沒有辦法讓我檢測文件上傳是否被中斷?

我假設“sftp 客戶端”指的是 OpenSSH SFTP 客戶端。“問題”是當您按下 時Ctrl+C,它會停止上傳並乾淨地關閉遠端文件,就像上傳完全完成一樣(注意這是正確的行為,許多其他 SFTP 客戶端的行為相同)。所以伺服器絕對沒有辦法告訴上傳被中斷了。


嚴格來說它有,因為 OpenSSH 客戶端在創建文件時會向伺服器發送大小提示。但是 OpenSSH 伺服器不使用也不記錄這些資訊。儘管修改其程式碼以記錄大小會非常簡單,但如果您願意的話。

見:process_open_sftp-server.c

a = get_attrib();
flags = flags_from_portable(pflags);
mode = (a->flags & SSH2_FILEXFER_ATTR_PERMISSIONS) ? a->perm : 0666;
logit("open \"%s\" flags %s mode 0%o",
   name, string_from_portable(pflags), mode);

logit將語句更改為:

logit("open \"%s\" flags %s mode 0%o size %llu",
   name, string_from_portable(pflags), mode, (unsigned long long)a->size);

請注意,發送尺寸提示是可選的。雖然有些 SFTP 客戶端會發送它(例如 OpenSSH 或 WinSCP),但有些不會(例如 PSFTP、FileZilla 或 LFTP)。在這種情況下,您將在a->size.


如果客戶端真的中止了上傳(沒有完全關閉遠端文件,例如何時sftp被殺死),您將能夠將其從“強制”前綴告訴“關閉”記錄:

強制關閉“/data/README.md”字節讀取 0 寫入 5366

引用自:https://serverfault.com/questions/652629