Ssh
如何使用 OpenSSH SFTP 伺服器檢測或記錄中斷的上傳?
我有這個問題,我們的客戶一直在 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