我正在尝试使用 rsync 每天将本地计算机上的备份文件夹复制到另一台计算机(以防数据丢失或意外删除)。这以 cronjob 的形式运行。
我只是命令
rsync -av --rsh='ssh -p90' --delete /backup/ [email protected]:~/dabackup/
来自root
服务器一上的帐户(tent
)。
然而,在第一台服务器上,每个子目录的权限都设置为,除非您是 root 身份(对文件夹没有执行权限),否则您无法进入它们,这是我无法轻易改变的,因为这是备份软件的工作方式。
这意味着在第二台服务器(mydomain.com
)上,该帐户tentbackup
没有权限进入 rsync 创建的文件夹,从而导致以下错误
root@tent:~$ rsync -av --rsh='ssh -p92' --delete /backup/ [email protected]:~/dabackup/
building file list ... done
03-05-11/apache/
rsync: recv_generator: mkdir "/home/tentbackup/dabackup/03-05-11/apache" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
03-05-11/bind/
rsync: recv_generator: mkdir "/home/tentbackup/dabackup/03-05-11/bind" failed: Permission denied (13)
*** Skipping any contents from this failed directory ***
03-05-11/custom/
rsync: recv_generator: mkdir "/home/tentbackup/dabackup/03-05-11/custom" failed: Permission denied (13)
etc...
[email protected]
我可以使用( )解决这个问题server two
,但显然我不希望将 root 帐户的 ssh 密钥存储在server one
(tent
)。
我如何安全地允许rsync
创建这些子文件夹和文件的权限吗?
即使以 tentbackup 身份直接登录到服务器二,我也无法进入目录或在其中创建文件
tentbackup@brave:~/dabackup$ cd 03-20-11/
bash: cd: 03-20-11/: Permission denied
tentbackup@brave:~/dabackup$ mkdir 03-20-11/test -p
mkdir: cannot create directory `03-20-11': Permission denied
tentbackup@brave:~/dabackup$ touch 03-20-11/test
touch: cannot touch `03-20-11/test': Permission denied
答案1
正确的方法是将以下内容添加到 rsync 命令中(尽管它确实会更改权限,因此如果这些权限很重要,您不能仅从备份中恢复)
--no-p --no-g --chmod=ugo=rwX
在哪里
--no-p
禁用权限复制
--no-g
禁用群组复制和
--chmod=ugo=rwX
确保所有非屏蔽位都得到启用
答案2
您正在尝试执行设置权限明确禁止的操作。您必须更改设置权限或授予程序特殊权限。一种解决方法可能是cron
在服务器上创建一个修复目录权限的作业。或者,您可以让一个运行的程序等待root
来自ssh
脚本的命令并修复目录权限。
答案3
您应该能够通过从 rsync 中删除 -a 标志并使用您需要的任何标志来做到这一点。从配置逻辑上讲,您不想以 root 身份执行此操作,这意味着您需要忽略目标端的权限。确保您没有在 rsync 命令中包含 -p,并且您应该能够安全地将文件从 root@serverone 复制到 user@servertwo,并且它应该能够创建目录等。只需记住,如果您需要从备份中恢复,您的权限树将不会出现在 servertwo 上,我希望编写一个脚本来修复这个问题应该相当容易。
否则,您将需要获得特殊访问权限才能在 servertwo 上创建和管理文件,您可以通过设置 rsyncd.conf 并在守护进程模式下使用 rsync 来实现此目的,这样您就不需要允许两个主机之间使用 ssh(从问题中不清楚是否有其他用户有权访问该主机,因此可能不够安全)。