Watch at Ease看見世界,讀懂生活。

科技 · 實用指南

Rsync 顯示「protocol version mismatch」?先擷取遠端位元流再改 shell

先證明是多餘 stdout、SSH 強制命令、遠端 rsync 不可用,還是真正版本邊界;不要直接刪啟動腳本或強制 --protocol。

Original diagram connecting raw SSH output, the command actually executed by sshd, and local and remote rsync binary evidence.
原創示意圖:連接原始位元流、實際執行命令和兩端版本。 Watch at Ease

此訊息表示客戶端收到的起始位元不像預期的 rsync 協定。啟動輸出很常見,但錯誤本身不能證明 .bashrc 有罪;ForceCommand、僅 SFTP 帳戶、遠端 PATH、PTY 或舊版本邊界都可能造成相同結果。

保留同一條證據鏈:完整命令、無 PTY 的 stdout 原始位元、分離的 stderr、sshd 允許的遠端命令、兩端二進位檔與版本,以及一次性檔案驗證。只修改有正面證據的分支。

凍結失敗傳輸上下文

記錄本地命令、方向、來源/目的語法、主機別名、使用者、連接埠、認證路徑、退出碼和兩個輸出流。以 ssh -G 保存有效設定,但不要公開密鑰。

互動登入成功不是等價對照,因為它可能分配終端、走不同啟動路徑,也不會執行 rsync 所需的遠端命令。

無 PTY 擷取遠端標準輸出位元

執行 ssh -T remotehost /bin/true >out.bin 2>err.txt,記錄位元組數並安全查看十六進位預覽。out.bin 非空就先找出輸出者。

檢查 shell 啟動檔、登入橫幅、wrapper 與 shell 初始化。把人類提示限制在互動工作階段,不要合併輸出掩蓋證據。

輸出為空時證明 sshd 實際執行內容

檢查 authorized_keys 與 Match 區塊中的 command=、ForceCommand、internal-sftp、ChrootDirectory、no-user-rc 與 wrapper。強制命令會忽略客戶端命令。

rsync 需要遠端執行 rsync --server;僅 SFTP 或固定命令會破壞此契約。若確實需要 rsync,應使用經審核的允許清單 wrapper。

明確解析遠端二進位檔與版本

在同一非互動環境記錄 command -v rsync 與絕對路徑 --version,並和本地路徑、版本比較。chroot 或 PATH 可能讓二進位檔不可見。

只有串流乾淨且命令被允許後才測試 --protocol;它是範圍有限的相容性實驗。

用一個一次性檔案閉環

建立已知內容的小檔案,無 PTY 執行一次 verbose 傳輸,記錄版本、退出碼、大小和兩端校驗和。保留失敗與成功記錄。

相同帳戶與限制策略執行預期命令、無額外位元且檔案驗證通過後才恢復自動化。僅 SFTP 帳戶應使用 SFTP 原生傳輸。

Original decision diagram separating stray stdout, forced SSH commands, remote PATH failures, and genuine rsync version boundaries.
原創示意圖:用正面測試關閉一個協定分支。 Watch at Ease