我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
) 选项来向您展示会发生什么,但实际上无需更改任何内容。