科技 · 实用指南
Rsync 报“protocol version mismatch”?先捕获远端字节流再改 shell
先证明是多余 stdout、SSH 强制命令、远端 rsync 不可用,还是实际版本边界;不要直接删启动脚本或强制 --protocol。

该提示表示客户端收到的起始字节不像预期的 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 启动文件、登录横幅、包装脚本与 shell 专属初始化。把人类提示限制在交互会话,不要用 -q 或合并重定向掩盖证据。
输出为空时证明 sshd 实际执行了什么
检查 authorized_keys 选项和适用的 Match 块:command=、ForceCommand、internal-sftp、ChrootDirectory、no-user-rc 与包装脚本。强制命令会忽略客户端命令,并把原命令放进 SSH_ORIGINAL_COMMAND。
rsync 会要求远端运行 rsync --server;仅 SFTP、固定备份命令或丢弃参数的 wrapper 都会破坏该合同。若确需 rsync,应审阅允许列表 wrapper,而不是取消全部限制。
明确解析远端二进制与版本
在同一非交互上下文记录 command -v rsync 与绝对路径 rsync --version,并与本地路径和版本比较。chroot 或受限 PATH 可能让远端程序不可见。
只有字节流干净且命令被允许后才测试 --protocol。它是范围受控的兼容性实验,不是永久通用修复。
用一个一次性文件闭环
创建已知内容的小文件,无 PTY 运行一次 verbose 传输,记录命令、版本、退出码、目标大小与两端独立校验和。把失败与成功记录放在一起。
只有相同账户与限制策略执行了预期命令、无多余字节且文件校验通过,才恢复自动任务。若账户本就只允许 SFTP,应改用 SFTP 原生传输。
