通过SSH使用rsync上传文件时遭遇协议数据流错误及无服务器问候问题的解决求助
我现在遇到了一个rsync over SSH的问题,想请大家帮忙排查一下。先把我的配置和操作过程说清楚:
服务器端配置
- rsync配置文件:
/root/.ssh/rsync.conf
uid = root gid = root use chroot = false [data] path = /var/www/data
- 授权密钥配置:
/root/.ssh/authorized_keys里添加了一行:
command="rsync --server --daemon --config rsync.conf ." ssh-rsa AAAAB3N...
客户端配置
我的/home/me/.ssh/config是这样的:
Host rsync_data User root IdentitiesOnly yes IdentityFile /home/me/.ssh/id_rsa_rsync ProxyCommand ssh eu -W 172.17.16.16:22 Host eu User me Port 4343 Hostname My_Public_IP_Address_here IdentitiesOnly yes IdentityFile /home/me/.ssh/id_rsa_rsync
执行的rsync命令
rsync \ --delete \ -avz \ --stats \ --progress \ -e 'ssh -F /home/me/.ssh/config' \ /home/me/Documents/dev/data/ rsync_data::data
遇到的错误
SSH连接是正常的(我在服务器的/var/log/auth.log里能看到成功的连接记录),但rsync抛出了错误:
rsync error: syntax or usage error (code 1) at clientserver.c(1223 [Receiver=3.2.3] rsync: connection unexpectedly closed (0 bytes received so far) [sender] rsync error: error in rsync protocol data stream (code 12) at io.c(231) [sender=3.2.7]
排查与解决建议
结合我处理这类问题的经验,给你几个实用的排查方向,你可以逐一尝试:
修正rsync配置文件的路径
你在authorized_keys里用的是相对路径rsync.conf,但SSH触发rsync daemon时的工作目录不一定是/root,大概率找不到配置文件。建议改成绝对路径:command="rsync --server --daemon --config /root/.ssh/rsync.conf ." ssh-rsa AAAAB3N...这是这类问题最常见的诱因,相对路径在受限的command环境下很容易失效。
手动验证rsync daemon启动命令
直接在服务器上执行rsync --server --daemon --config /root/.ssh/rsync.conf .,看看会不会报错。如果配置文件有语法错误(比如格式不对、缺漏符号),这里会直接给出提示。简化命令测试版本兼容性
客户端是3.2.7,服务器是3.2.3,虽然版本差距不大,但偶尔会有协议兼容问题。先简化命令去掉可能有争议的参数:rsync -avz -e 'ssh -F /home/me/.ssh/config' /home/me/Documents/dev/data/ rsync_data::data如果简化后能成功,再逐个加参数排查是哪个参数导致的问题。
添加rsync日志定位细节
默认rsync daemon不会记录详细日志,你可以在rsync.conf里加上:log file = /var/log/rsyncd.log之后执行客户端命令,查看日志里的具体错误,这能帮你快速定位是配置、权限还是其他问题。
测试SSH能否正确触发rsync daemon
直接执行ssh rsync_data,正常情况下应该返回rsync daemon的问候信息(类似@RSYNCD: 31.0)。如果没有返回,说明authorized_keys里的command执行失败了,可以临时修改command添加日志输出:command="rsync --server --daemon --config /root/.ssh/rsync.conf . > /tmp/rsync_debug.log 2>&1" ssh-rsa AAAAB3N...执行
ssh rsync_data后,去服务器的/tmp/rsync_debug.log查看具体错误。确认目标目录权限
虽然用的是root用户,但/var/www/data的权限是否允许root读写?执行ls -ld /var/www/data确认,确保root拥有rwx权限。
备注:内容来源于stack exchange,提问作者philippe

