应如何配置 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 [email protected]:/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
verify-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 的最简单/最佳方法是什么。
答案1
这为什么很简单...ForceCommand
正如它所说的那样:连接后,它会强制您运行该命令,无论您实际想做什么。在这种情况下,该命令没有 /usr/bin/rsync
标志。
rsync
通过在连接的另一端运行另一个副本rsync
并通过 ssh 与其通信来工作。但在这种情况下,它无法使用所需的标志启动另一端,因为命令被替换为/usr/bin/rsync
rsync-validate 脚本可能是解决此问题的最佳方法。它会检查请求以确保它是有效的 rsync 服务器命令,然后才会运行它。 rsync
可能可以可以修改为在没有参数的情况下运行时直接检查 $SSH_ORIGINAL_COMMAND,但出于安全原因不这样做可能是有充分理由的。
答案2
该ForceCommand
选项旨在与明确理解其充当SSH 守卫. 原命令放在SSH_ORIGINAL_COMMAND
环境变量中。
答案3
我不认为你可以ForceCommand
和任何rsync 命令,但您可以使其与该命令配合使用。从客户端,您可以运行:
rsync -azh -e 'ssh -v' [email protected]:/opt/backups/automatic/cron/mysql/ /tmp/.
获取服务器端命令。您将在密钥交换之后但在复制开始之前在详细输出中看到它:
...
debug1: Sending command: rsync --server -vlogDtprz --delete . /tmp
...
然后您可以将其添加到您的ForceCommand
:
ForceCommand rsync --server -vlogDtprz --delete . /tmp