Rsync

使用 chown 選項時,rsync 未設置新創建的父目錄的所有權

  • July 15, 2021

我想從一個系統中同步一個子目錄,並將其放在遠端主機上同一父目錄(不存在)中的遠端主機上。如果我使用 rsync 作為 root 並指定 chown 子目錄所有權在遠端系統上是正確的,但新創建的父目錄不正確,則父目錄最終是 root 擁有的。由於某些違反 ssh 安全規則的權限問題(不允許我使用遠端主機上的目標帳戶的密鑰),我必須以 root 身份執行此操作。

例子:

系統A:

  • bob123:bob123 755 - /home/bob123/configurations/
  • bob123:bob123 755 - /home/bob123/configurations/app1/
  • bob123:bob123 755 - /home/bob123/configurations/app2/

系統 B:

  • bob123:bob123 755 - /home/bob123/ (這個目錄是空的)

作為系統 A 上的根使用者:

rsync --chown=bob123:bob123 -IHrlptD /home/bob123/configurations/app4 system-b:/home/bob123/configurations/

結果是:

  • 根:根755 - /home/bob123/configurations
  • bob123:bob123 755 - /home/bob123/configurations/app4

我嘗試了不同的選項,但還沒有找到一個有效的選項,並且在目錄樹所有權和權限正確(由 bob123:bob123 擁有)system-b:/home/bob123/configurations時始終由 root 擁有。app4

如果迫不得已,我可以使用 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

您的命令(此處簡化)不包含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/

處理此問題的另一種方法是登錄為bob123on system-b,以便目標使用者隱式擁有所有內容:

rsync -Ia /home/bob123/configurations/app4 bob123@system-b:configurations/

PS你真的想要-I--ignore-times)?除非你確定你需要這個標誌,否則不要使用它。

引用自:https://unix.stackexchange.com/questions/658294