“协议版本不匹配——你的外壳干净吗?” 外壳干净时出现 rsync 错误

EM0*_*EM0 6 linux ubuntu ssh rsync

我正在尝试使用 rsync 下载文件,其中 rsync 通过服务器上的 SSH 以守护进程模式运行,并在客户端上收到以下错误:

rsync -a myserver:/remote/path/ localdestdir/
protocol version mismatch -- is your shell clean?
(see the rsync man page for an explanation)
rsync error: protocol incompatibility (code 2) at compat.c(176) [Receiver=3.1.1]
Run Code Online (Sandbox Code Playgroud)

服务器在用户的 .ssh/authorized_keys 中有这个:

command="rsync --config=/path/to/engine-rsyncd.conf --server --daemon ." ssh-rsa ...
Run Code Online (Sandbox Code Playgroud)

我读过所有我能找到关于这个问题,正如大家所暗示的,经检查发现外壳是干净的,它是干净的

ssh myserver false >out.tmp
Run Code Online (Sandbox Code Playgroud)

创建一个零长度文件 out.tmp (如果我从服务器上的 authorized_keys 中删除“command=...”)。

我还尝试在服务器上将用户的 shell 设置为 rssh 而不是 bash - 同样的事情。

客户端和服务器都运行 Ubuntu 16.04,因此它们具有相同版本的 rsync(3.3.1,协议 31)。

还能是什么?我尝试在 rsync 和 SSH 中启用详细日志记录,但日志没有给我任何线索。rsync 守护进程不会记录任何超过

2018/02/12 15:14:24 [6215] connect from clienthostname
Run Code Online (Sandbox Code Playgroud)

Ral*_*edl 2

在这种情况下,您的问题不是 shell 不干净,而是客户端 rsync 可以执行它需要在服务器上执行的命令。如果您在authorized_keys中使用command="rsync...",那么这就是sshd将执行的命令,而不管客户端传递的命令是什么。

客户端 rsync 将使用以下参数调用 ssh:

ssh myserver rsync --server --sender -de.LsfxC 。/远程/路径/`。

请注意,这--sender是这些选项的一部分,因为您希望服务器向您发送文件。如果服务器应该接收文件,则它不存在。另请注意,--daemonrsync 的选项中不存在该选项。由于该选项--config仅与 相关--daemon,因此也可以从命令条目中删除它。

我已经提到过,该命令将完全按照authorized_keys 文件中的方式执行。这意味着从客户端传递的所有参数都将被忽略。因此,如果您确实想在authorized_keys中使用命令,则必须指定rsync将提供给ssh客户端的确切选项,这意味着您只能使用rsync从authorized_keys中指定的路径接收文件。如果您在客户端上为 rsync 提供不同的选项,它们将不会在服务器上生效,因此可能会也可能不会起作用,具体取决于这些选项的效果是在客户端还是在 rsync 的服务器端实现。所以你应该考虑一下你是否真的想要这样。

编辑 您可以使用脚本作为命令并检查 SSH_ORIGINAL_COMMAND 环境变量以根据需要调用 rsync。由于远程路径是最后一个参数,您可能只想检查它是否以正确的前缀开头并且不包含任何将转到父目录的“/..”。