我想从一个系统 rsync 一个子目录,并将其放置在远程主机上的同一父目录(不存在)中。如果我使用 rsync 作为 root 并指定 chown ,则远程系统上的子目录所有权是正确的,但新创建的父目录不正确,则父目录最终将由 root 拥有。由于一些违反 ssh 安全规则的权限问题(不允许我在远程主机上的目标帐户上使用密钥),我必须以 root 身份执行此操作。
例子:
系统A:
- bob123:bob123 755 - /home/bob123/配置/
- bob123:bob123 755 - /home/bob123/configurations/app1/
- bob123:bob123 755 - /home/bob123/configurations/app2/
- ...
系统B:
- 鲍勃123:鲍勃123 755 - /home/鲍勃123/(该目录是空的)
作为系统 A 上的 root:
rsync --chown=bob123:bob123 -IHrlptD /home/bob123/configurations/app4 system-b:/home/bob123/configurations/
结果是:
- 根:根第755章-/home/bob123/配置
- bob123:bob123 755 - /home/bob123/configurations/app4
我尝试了不同的选项,但尚未找到有效的选项,并且system-b:/home/bob123/configurations
始终由 root 拥有,同时app4
目录树所有权和权限正确(由 bob123:bob123 拥有)。
如果推送到了紧要关头,我可以使用 ssh 来运行 mkdir,但想知道是否可以仅使用 rsync 来完成我想要的操作。
更新:不确定这是否重要,但系统是使用 rsync 3.1.2 和 OpenSSH_7.6p1 的 Ubuntu 18.04。
############ 解决方案: ############
谢谢@roaima 的帮助!
该-R
选项/./
是缺少的选项。我还必须包括这些-go
选项。
我最终得到了类似以下的结果:
rsync --chown=bob321:bob321 -IHazR /home/bob123/./configurations/app4 system-b:/home/bob321/
如果两个系统上都存在相同的用户,我不必使用,--chown
但对于具有不同进程所有者的远程系统来说,则必须使用。上面的例子是利用chown来体现不同的用法。在我的脚本中,chown 选项设置取决于远程主机地址。
再次感谢@roaima 通过该-R
选项为我指明了正确的方向!
答案1
您的命令(此处简化)不包含configurations
在要传输的目录列表中,因此诸如此类的传输规则chown
不适用
rsync -a /home/bob123/configurations/app4 system-b:/home/bob123/configurations/
鉴于/home/bob123
目标上已经存在,rsync
将创建一个进一步的目录来匹配目标/home/bob123/configurations
。然后它将源app4
文件或目录树复制到新创建的目标目录中。
如果您想configurations
包含在传输目录列表中,可以使用-R
( --recursive
) 标志并将源configurations
目录包含在传输树中
rsync --chown=bob123:bob123 -IHrlptDR /home/bob123/./configurations/app4 system-b:/home/bob123/
bob123
处理此问题的另一种方法是以on身份登录system-b
,以便目标用户隐式拥有所有内容:
rsync -Ia /home/bob123/configurations/app4 bob123@system-b:configurations/
PS 你真的想要-I
(--ignore-times
)吗?除非您确定需要此标志,否则不要使用它。