sshd_config ForceCommand /usr/bin/rsync 错误“连接意外关闭”

cal*_*ban 6 ssh rsync

应该如何配置 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  
Run Code Online (Sandbox Code Playgroud)

在本地服务器上运行的 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]
Run Code Online (Sandbox Code Playgroud)

如果我将 ForceCommand 配置为精确的 rsync 命令,例如下面的命令,我可以作为备份用户成功地远程 rsync,但对于这个项目,我不想使用完整的精确命令,如下所示:

ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/mysql/
Run Code Online (Sandbox Code Playgroud)

如果我将 ForceCommand 配置为使用如下脚本,我就可以成功地远程同步。我很好奇为什么这有效而 /usr/bin/rsync 无效?

Match User backup
    PasswordAuthentication no  
    PubkeyAuthentication yes  
    AllowTCPForwarding no  
    X11Forwarding no  
    ForceCommand /home/backup/cron/validate-rsync  
Run Code Online (Sandbox Code Playgroud)

验证 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   
Run Code Online (Sandbox Code Playgroud)

我的主要问题是为什么 ForceCommand /usr/bin/rsync 不起作用?

我也很好奇做到这一点的最佳方法。我无法 chroot 备份用户,因为我要从几个不同的文件夹进行复制。我真的不想使用完全准确的 rsync --server --client 等命令,因为我正在复制几个不同的文件夹,这似乎过多。我很好奇将备份用户限制为 rsync 的最简单/最好的方法。

Der*_*rfK 3

原因很简单...正如它所说:您连接后,它会强制您运行该命令ForceCommand无论您实际上想做什么。在这种情况下,该命令 /usr/bin/rsync没有标志。

rsyncrsync其工作原理是在连接的另一端运行另一个副本并通过 ssh 与其进行通信。但在这种情况下,它无法使用所需的标志启动另一端,因为该命令被替换为/usr/bin/rsync

您的 rsync-validate 脚本可能是解决此问题的最佳方法。它检查请求以确保它是有效的 rsync 服务器命令,然后才运行它。 rsync可能可以修改为在不带参数运行时直接检查 $SSH_ORIGINAL_COMMAND,但可能有一个很好的安全原因不这样做。