如何配置ForceCommand以允许备份用户执行任何rsync命令?将ForceCommand设置为/usr/bin/rsync后,我收到以下错误:连接意外关闭…
托管要复制的文件的远程服务器上的/ etc / ssh / sshd_config:
Match User backup PasswordAuthentication no PubkeyAuthentication yes AllowTCPForwarding no X11Forwarding no ForceCommand /usr/bin/rsync
rsync命令在从远程服务器执行复制的本地服务器上运行:
rsync -avzh --progress backup@hostname.domain:/opt/backups/automatic/cron/MysqL/ /tmp/. rsync: connection unexpectedly closed (0 bytes received so far) [Receiver] rsync error: error in rsync protocol data stream (code 12) at io.c(601) [Receiver=3.0.7]
如果我将ForceCommand配置为完全rsync命令(例如下面的命令),我可以远程rsync成功备份用户,但对于此项目,我不想使用完整的命令,如下所示:
ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/MysqL/
如果我将ForceCommand配置为使用下面的脚本,我可以成功远程rsync.我很好奇为什么会这样,而/usr/bin/rsync却没有?
Match User backup PasswordAuthentication no PubkeyAuthentication yes AllowTCPForwarding no X11Forwarding no ForceCommand /home/backup/cron/validate-rsync
validate-rsync脚本:
#!/bin/sh #script to validate rsync #script source: http://troy.jdmz.net/rsync/#validate-rsync case "$SSH_ORIGINAL_COMMAND" in *\&*) echo "Rejected" ;; *\(*) echo "Rejected" ;; *\{*) echo "Rejected" ;; *\;*) echo "Rejected" ;; *\<*) echo "Rejected" ;; *\`*) echo "Rejected" ;; *\|*) echo "Rejected" ;; rsync\ --server*) $SSH_ORIGINAL_COMMAND ;; *) echo "Rejected" ;; esac
我的主要问题是为什么ForceCommand /usr/bin/rsync不起作用?
我也很好奇这样做的最佳方式.我无法chroot备份用户,因为我正在从几个不同的文件夹复制.我真的不想使用完整的rsync –server –client等命令,因为我正在复制几个不同的文件夹,这似乎过多.我很好奇将最简单/最好的方法限制为将备份用户限制为rsync.
解决方法
原因很简单…… ForceCommand完全按照它所说的做法:你连接,无论你真正想做什么,它都会强迫你运行那个命令.在这种情况下,该命令是/usr/bin/rsync,没有标志.
rsync通过在连接的另一端运行另一个rsync副本并通过ssh与它通信来工作.但在这种情况下,它无法使用所需的标志启动另一端,因为该命令被/usr/bin/rsync替换
您的rsync-validate脚本可能是解决此问题的最佳方法.它检查请求以确保它是有效的rsync服务器命令,然后才运行它.可能会修改rsync以在没有参数的情况下直接检查$SSH_ORIGINAL_COMMAND,但可能有一个很好的安全原因不这样做.