使用 chown 选项时,rsync 不设置新创建的父目录的所有权

使用 chown 选项时,rsync 不设置新创建的父目录的所有权

我想从一个系统 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)吗?除非您确定需要此标志,否则不要使用它。

相关内容