有没有办法将自定义参数发送到 rsync 服务器?

sta*_*fry 6 ssh rsync

我有一个客户端与rsync 一起使用的备份服务器通过 SSH。服务器被配置为运行一个自定义的 shell 脚本,该脚本包装了 rsync 服务器端的调用。客户端不知道这一点,可以发出任何有效的 rsync 命令行。

我想将客户端的一些参数传递到该 shell 脚本中。就像是

$ rsync -av -customarg1 value1 -customarg2 value2 file1 file2 user@server
Run Code Online (Sandbox Code Playgroud)

客户端rsync拒绝任何它不知道的参数,就像ssh(via rsync -e) 一样。我想出的最好方法是将参数作为假的服务器端文件规范传递,脚本在执行它以启动 rsync 服务器之前从服务器端命令行中提取这些规范。即像这样的命令

$ rsync -av file1 file2 user@server:some/path\;customarg1=value1\;customarg2=value2
Run Code Online (Sandbox Code Playgroud)

将提供两个参数,然后表现得好像命令是

$ rsync -av file1 file2 user@server:some/path
Run Code Online (Sandbox Code Playgroud)

(这使用 SSH 设置许多环境变量的事实,包括$SSH_ORIGINAL_COMMAND其中包含 ssh 客户端发出的命令(即 rsync 客户端启动的 rsync 服务器命令),而不管 ssh 服务器配置为执行什么(即自定义 shell脚本))

meu*_*euh 5

也许您可以使用-M选项(长版--remote-option),客户端 rsync 似乎没有检查该选项。-M-xxxx被传递到遥控器,-M剥离为-xxxx。您可以使用 轻松地玩这个-M-M-xxxx,它被客户端和远程忽略:

rsync -av -M-M-myvar=val /tmp/test/ remote:test/
Run Code Online (Sandbox Code Playgroud)

如果您的服务器前端在调用 rsync 之前识别并删除生成的标志,则您将获得所需的信息。

您可以进一步玩,--rsync-path它允许您运行任何脚本。它将连接远程参数。例如

rsync -a -M-myvar=val --rsync-path='echo hello >/tmp/out; ./mysync' /tmp/test/ remote:test/
Run Code Online (Sandbox Code Playgroud)

将在遥控器上运行类似

echo hello >/tmp/out
./mysync --server -logDtpre.iLsfx -myvar=val . test/
Run Code Online (Sandbox Code Playgroud)