在发生一次由于错误的目标参数而导致 rsync 删除错误文件的严重事故后,我想限制 rsync(或运行它的 bash 脚本)只能删除/修改特定目录下的文件。我想到以下任一方法:
在仅对该目录具有权限的用户下创建并运行 rsync/script。这里的问题是:如何动态使用/创建这样的用户?(这是构建脚本的一部分,应该“只为其他用户运行”)。
验证提供给 rsync 的目标路径是否位于某个目录下。方向似乎是使用命令
test
,但我不知道如何正确使用它,而且它不太安全,因为路径参数的测试仍然可能与正在运行的实际路径参数不同步,所以我认为 (1) 更可靠。
答案1
使用公钥认证时,您可以借助 authorized_keys 文件和 rrsync(rsync 的一部分)来强制执行此类行为。它通常位于 rsync 文档目录中,以 gzip 格式压缩,例如在 Debian 机器中:/usr/share/doc/rsync/scripts/rrsync.gz
在目标机器上,您需要:
- 将脚本提取到某个位置,例如“
/usr/bin
”或“~/bin
” ~/.ssh/authorized_keys
在“ ”中设置授权密钥- 在键前面添加命令选项集:
command="/usr/bin/rrsync /foo/bar/baz" ssh-rsa AAAA[...]
当使用设置的 rootdir 进行 rsyncing 时,不要忘记修改目标路径以相对于给定的 rootdir。
答案2
如果您可以在目标上启动 rsync 守护程序,则可以预定义允许访问的目录(称为模块)。只需编辑 /etc/rsyncd.conf 并添加以下内容:
[mydirectory]
path = /tmp
现在您可以使用别名(模块)名称而不是原始目录路径通过 rsync 协议进行传输:
rsync --delete /origin/dir rsync://$DEST_HOST/mydirectory
/我的目录将被翻译为/tmp,如果你拼写错误我的目录您将会看到错误,而不是弄乱文件。
这可能是最简单的示例,但您还可以配置身份验证和许多其他参数。您可以在此处找到更多信息: