rsync提示'protocol version mismatch — is your shell clean?'但Shell已清理的问题
针对你遇到的这个问题,结合你已经完成的排查步骤(移除authorized_keys的command配置、更换rssh shell),我再给你几个具体的排查和解决方向:
仔细核对authorized_keys的command配置(若需保留)
如果你需要通过authorized_keys的command字段限制rsync操作,必须确保这个命令没有任何额外输出,且严格匹配rsync守护进程的调用逻辑。正确的配置示例应该是:command="/usr/bin/rsync --server --daemon .",no-port-forwarding,no-agent-forwarding,no-X11-forwarding,no-pty ssh-rsa AAAAB3NzaC1yc2E...这里要注意:使用rsync的绝对路径(避免环境变量冲突)、确保
--server --daemon .参数准确,而且该命令执行时不能输出任何日志、提示信息——哪怕是一个多余的空格或换行,都会打乱rsync的协议握手流程。彻底清理用户的shell初始化文件
哪怕换成了rssh,也要检查该用户的~/.bashrc、~/.profile、~/.bash_profile,甚至系统级的/etc/profile、/etc/bash.bashrc等文件,看看里面有没有echo、printf、banner这类会输出内容的命令。这些内容会在SSH连接时被发送到客户端,直接干扰rsync的协议通信。
你可以临时把这些文件重命名(比如mv ~/.bashrc ~/.bashrc.temp),再测试rsync连接,如果问题解决,再逐个恢复文件排查具体是哪一行内容导致的污染。测试SSH连接的纯输出内容
直接在客户端执行ssh your_user@your_server,观察是否有任何输出(包括欢迎语、错误提示、Motd信息)。如果有,这些就是污染shell的“脏内容”。比如有些服务器会给用户显示每日提示,你可以检查/etc/motd、/etc/update-motd.d/下的脚本,或者用户家目录的~/.motd文件,确保这些内容不会对该用户输出。用rsync的详细日志定位问题
在客户端加上-vvv参数执行rsync,比如:rsync -vvv your_user@your_server::your_module/your_path ./local_dir/这个命令会输出非常详细的调试信息,你能清晰看到SSH连接后服务器发送的每一段内容。如果里面出现了非rsync协议的文本(比如“Welcome!”或者bash的错误提示),那就是这段内容导致的版本不匹配,针对性清理即可。
确认rssh的配置是否正确
如果你换成了rssh,要检查/etc/rssh.conf里是否启用了rsync支持:确保存在allowrsync这一行,且没有禁用该用户的rsync权限。另外,rssh本身的错误输出也可能干扰协议,你可以查看rssh的日志(通常在/var/log/auth.log或/var/log/secure),排查是否有相关报错。
内容的提问来源于stack exchange,提问作者EM0

