应如何configurationForceCommand以允许备份用户执行任何rsync命令? 随着ForceCommand设置为/ usr / bin / rsync我收到以下错误:连接意外closures…
远程服务器上的/ etc / ssh / sshd_config托pipe要从以下位置复制的文件:
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]
如果我将ForceCommandconfiguration为精确的rsync命令(如下面的命令),我可以作为备份用户成功远程rsync,但是对于这个项目,我不想使用完整的精确命令,如下所示:
ForceCommand /usr/bin/rsync --server --sender -vlwkDonecf.iLew . /opt/backups/automatic/cron/mysql/
如果我将ForceCommandconfiguration为使用如下所示的脚本,则可以成功远程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 – 服务器 – 客户端等命令,因为我复制几个不同的文件夹,这似乎过度。 我很好奇最简单/最好的方式来限制备份用户rsync。
为什么很容易… ForceCommand完全按照它的说法:连接,无论你想要做什么,都会迫使你运行这个命令。 在这种情况下,该命令是/usr/bin/rsync ,不带标志。
rsync工作原理是在连接的另一端运行另一个rsync副本,并通过ssh与之通话。 在这种情况下,它不能用它所需的标志启动另一端,因为命令被replace为/usr/bin/rsync
您的rsyncvalidation脚本可能是最好的方法来解决这个问题。 它检查请求,以确保它是一个有效的rsync服务器命令,然后才运行它。 rsync可能会被修改,以便在没有参数的情况下直接检查$ SSH_ORIGINAL_COMMAND,但是可能有一个很好的安全原因,不这样做。
ForceCommand选项旨在用于特别了解其充当SSH网守的命令 。 原来的命令放在SSH_ORIGINAL_COMMAND环境variables中。