Ssh

如何使用 rsync 修復(相對)大文件的損壞數據包錯誤?

  • March 21, 2022

嘗試使用以下rsync命令更新伺服器上的文件:

rsync -ravq -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

corrupt packet錯誤不斷被拋出,特別是:

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (11337 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/io.c(605) [sender=3.0.9]

這可能與ssh超時有關,因為它似乎發生在大型(r)文件中。另外,我一直在使用 WinSCP 超時。這僅發生在我身上;與我一起工作的幾個使用此伺服器的人沒有同樣的問題。

從 Windows 7 中的 Cygwin 終端使用rsyncCentos 6.3 伺服器。

我不確定還有哪些其他資訊可能有用或如何獲取。我將根據任何建議更新問題或添加評論。

我應該如何解決這個問題?

非常感謝!

我不確定是什麼可能導致corrupt packet連接斷開的問題,但您可能會發現 rsync--partial--partial-dir選項在傳輸大文件時很有幫助,這樣當您重新啟動傳輸時,它將從傳輸中斷的地方繼續,而不必重新開始傳輸再次整個文件:

–partial-dir=.rsync-partial

因此,您可以像這樣修改原始命令:

rsync -rav --progress --partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

或者

rsync -rav --progress --partial-dir=.rsync-partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

請注意,對於此範例,我刪除了-q( --quiet) 選項,並--progress在第一個範例和--partial-dir=.rsync-partial第二個範例中添加了該選項。

--partial和之間的區別在於,--partial-dir=.rsync-partial如果在接收(伺服器)端對您很重要,則後者會創建一個目錄,將部分文件與完全傳輸的文件分開。

rsync 手冊頁將更詳細地解釋這一點,儘管我也會從手冊頁中指出一個重要的安全說明

重要提示:–partial-dir 不應被其他使用者寫入,否則存在安全風險。例如,避免使用“/tmp”。

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