RSYNC 不会覆盖根文件

RSYNC 不会覆盖根文件

rsync这样使用:

rsync . -vzp --rsync-path "sudo rsync" --chown=user:user  --exclude .git --progress -e "ssh -p <PORT>" user@<PUBLIC_IP>:/home/user/rsync/

在目标服务器上有类似的命令chown root:root。之后是另一个rsync命令。但rsync不会覆盖具有 root 所有权的文件。是否有任何标志rsync允许我覆盖根文件?

答案1

我从未尝试过使用--rsync-path "sudo rsync",但我不希望你的方式起作用,通常通过指定路径,程序将首先使用该路径来确定文件存在并且可执行,“sudo rsync”不是有效路径!

也许您可以指定一个 shell 脚本(您需要编写)来执行您想要的操作并转发参数,但是您的 sudo 将无法获取您的密码!

其次,如果您在更改所有权时指定名称,这些名称需要存在于远程系统上,使用数字 ID 会更好。

如果您要传输 root 和用户都拥有的文件,我建议在服务器上以 root 身份登录并使用--numeric-ids

也许最好重新考虑你的策略。

两个 rsync 运行,一个为用户运行,第二个为根文件运行,以便您可以在恢复时正确控制映射。如果您没有服务器上的根访问权限,这将起作用。但这会带来安全风险。存储在服务器上的根文件可由该服务器上的管理员读取!

就 rsync 而言,它们存储为用户所有并不重要,只要您在本地具有 root 访问权限,以便可以将它们映射回恢复中。除了安全风险。

根拥有的文件就像这样,因为它们可能包含不应在服务器上公开的敏感信息(密钥、密码等),请考虑加密!

您需要提供有关您的目标(包括恢复)以及您对本地和远程系统的访问类型的更多信息。

[编辑]

这是关于服务器故障的一个很好的答案,我忘记了假根选项,https://serverfault.com/a/755824

答案2

您使用的命令设置不会下降到子目录中,因此这不是拒绝覆盖根拥有的文件的情况,而只是根本没有考虑它们。您还应该包含--times( -t) 标志,以便rsync可以跳过已复制的文件。

试试这个:

rsync -vzrtp --rsync-path 'sudo rsync' --chown=user:user  --exclude .git --progress -e 'ssh -p {PORT}' ./ user@{PUBLIC_IP}:/home/user/rsync/

但请记住,您将把 root 拥有的文件写入看似由“用户”拥有的目录中。这通常不是一个好的做法,但它会起作用。

如果这是出于备份目的,您可能更愿意使用--fake-super远程端的选项(-M仅将该选项应用于远端),这样就无需以 root 身份运行远程服务。它需要一个可以处理扩展属性的远程文件系统(ext4其他本机 Linux 文件系统可以做到这一点)。在这种情况下,可以稍微修改命令以捕获所有元数据而不仅仅是权限和时间:

rsync -avzP -M--fake-super --exclude .git -e "ssh -p {PORT}" ./ user@{PUBLIC_IP}:/home/user/rsync/

当您从此类备份恢复文件时,-M-fake-super也必须使用它,以便远程rsync服务器使用其保存在扩展属性中的数据。另请注意,如果您确实转换到此变体,则您之前复制的 root 拥有的文件和目录都将不可覆盖,因此您需要先将它们移开(或恢复所有权) 。

最后,请记住,在测试时,您可以包含--dry-run( -n) 选项来向您展示会发生什么,但实际上无需更改任何内容。

相关内容