簡體   English   中英

通過SSH的rsync僅保留對www-data擁有的文件的所有權

[英]rsync over SSH preserve ownership only for www-data owned files

我使用rsync將Web文件夾結構從本地服務器復制到遠程服務器。 兩台服務器都是ubuntu linux。 我使用以下命令,它運行良好:

rsync -az /var/www/ user@10.1.1.1:/var/www/

本地系統和遠程系統的用戶名不同。 根據我的閱讀,可能無法保留所有文件和文件夾所有者和組。 沒關系,但我想保留兩個服務器上都存在的www-data用戶的所有者和組。

這可能嗎? 如果是這樣,我將如何做到這一點?

**編輯**

有人提到rsync能夠在這里保留遠程文件同步的所有權和組: http//lists.samba.org/archive/rsync/2005-August/013203.html

**編輯2 **

由於這里有許多有用的評論和答案,我最終獲得了理想的效果。 假設源計算機的IP是10.1.1.2,目標計算機的IP是10.1.1.1。 我可以在目標機器上使用這一行:

sudo rsync -az user@10.1.1.2:/var/www/ /var/www/

這樣可以保留具有通用用戶名的文件的所有權和組,例如www-data。 請注意,使用不帶sudo rsync不會保留這些權限。

您還可以使用--rsync-path選項在目標主機上sudo rsync:

# rsync -av --rsync-path="sudo rsync" /path/to/files user@targethost:/path

這允許您在targethost上作為user進行身份驗證,但仍然可以通過sudo獲得特權寫入權限。 您必須在目標主機上修改您的sudoers文件,以避免sudo請求您的密碼。 man sudoers或運行sudo visudo的指示和樣品。

您提到您希望保留www-data擁有的文件的所有權,但不保留其他文件的所有權。 如果這是真的,那么除非你實現chown或第二次運行rsync來更新權限,否則你可能會失敗。 沒有辦法告訴rsync只保留一個用戶的所有權。

也就是說,你應該閱讀rsync的--files-from選項。

rsync -av /path/to/files user@targethost:/path
find /path/to/files -user www-data -print | \
  rsync -av --files-from=- --rsync-path="sudo rsync" /path/to/files user@targethost:/path

我沒有測試過這個,所以我不確定管道查找輸出到--files-from=-確切方法。 你無疑需要進行實驗。

我有類似的問題,並欺騙rsync命令,

rsync -avz --delete root @ xxxx:/ home // domains / site / public_html / / home / domains2 / public_html && chown -R wwwusr:wwwgrp / home / domains2 / public_html /

當rsync成功完成時,&&運行對文件夾的chown(無論rsync完成狀態如何,1x'&'將運行chown)

據我所知,如果你不是root用戶,你不能將文件chown給別人。 因此,您必須使用www-data帳戶進行rsync ,因為將使用指定的用戶作為所有者創建所有文件。 所以你需要事后chown文件。

本地系統和遠程系統的root用戶不同。

這是什么意思? root用戶是uid 0.他們有什么不同?

對要復制的目錄具有讀取權限的任何用戶都可以確定哪些用戶名擁有哪些文件。 只有root才能更改正在寫入的文件的所有權。

您當前正在源計算機上運行該命令,該命令限制您對與user@10.1.1.1關聯的權限的寫入。 相反,您可以嘗試在目標計算機上以root身份運行該命令。 您在源計算機上的讀取權限不是問題。

所以在目標機器(10.1.1.1)上,假設源是10.1.1.2:

# rsync -az user@10.1.1.2:/var/www/ /var/www/

確保您的組在兩台計算機上都匹配。

另外,使用DSA或RSA密鑰設置對user@10.1.1.2的訪問權限,這樣可以避免密碼浮動。 例如,以目標計算機上的root身份運行:

# ssh-keygen -d

然后獲取文件/root/.ssh/id_dsa.pub的內容並將其添加到源計算機上的~user/.ssh/authorized_keys 您可以從目標計算機以root身份ssh user@10.1.1.2查看它是否有效。 如果您收到密碼提示,請檢查錯誤日志以查看密鑰無效的原因。

好吧,你可以完全跳過rsync的挑戰,只需通過tar隧道即可。

sudo tar zcf - /path/to/files | \
  ssh user@remotehost "cd /some/path; sudo tar zxf -"

您需要像Graham描述的那樣設置SSH密鑰。

請注意,這會處理完整目錄副本,而不是像rsync這樣的增量更新。

這里的想法是:

  • 你盯上你的目錄,
  • 而不是創建一個tar文件,你將tar輸出發送到stdout,
  • stdout通過SSH命令傳送到另一台主機上的接收 tar,
  • 但是接收tar是由sudo運行的,因此它具有設置用戶名的寫權限。

rsync版本3.1.2

我主要在本地使用windows,所以這是我用來與服務器同步文件的命令行(debian):

user@user-PC /cygdrive/c/wamp64/www/projects

$ rsync -rptgoDvhP --chown=www-data:www-data --exclude=.env --exclude=vendor --exclude=node_modules --exclude=.git --exclude=tests --exclude=.phpintel --exclude=storage ./website/ username@hostname:/var/www/html/website

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM