使用 setfacl 透過 rsync 為 Apache 建立遞歸權限

使用 setfacl 透過 rsync 為 Apache 建立遞歸權限

我在本機安裝了 Dokuwiki,我定期使用 rsync 將其同步到我的伺服器。我也會給我的一個朋友 ssh 帳戶,並託管他的公共 Dokuwiki 安裝。但是,我遇到了存取權限問題 - 即使鏡像是唯讀的,Dokuwiki 仍然需要對資料目錄的寫入權限以進行快取等。它重置權限。

根據本網站上的一些其他答案,我嘗試使用 setfacl 設定預設權限,但它似乎不起作用 - getfacl 指示權限存在,但 Dokuwiki 不會運行,當我嘗試將文件寫入為用戶www-data,它也不起作用。我缺什麼?

wiki/data$ sudo su www-data
$ pwd
/var/www/wiki/data
$ whoami
www-data
$ touch hi
touch: cannot touch `hi': Permission denied
$ getfacl /var/www/wiki/data
getfacl: Removing leading '/' from absolute path names
# file: var/www/wiki/data
# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

這是我用來設定權限的命令:

setfacl -R -d -m u:www-data:7 /var/www/*

答案1

問題#1:Rsync 正在刪除 ACL

套用 ACL 權限後,您需要注意,當您執行該操作時,rsync您將使用-A--acls開關。這指示rsync確保在進行同步時保留這些。

摘自 rsync 手冊頁

    -A, --acls                  preserve ACLs (implies -p)

問題#2:沒有 ACL 權限

在查看您的範例時,它確實包含以下權限。

傳統燙髮

# owner: stian
# group: admin
user::rwx
group::r-x
other::r-x

ACL

default:user::rwx
default:user:www-data:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

但這些 ACL 是用於建立新物件的,並且並非完全按照您的想法工作。www-data除了預設的 ACL 權限之外,您還需要為使用者建立一個條目。

例子

$ pwd
/tmp/somedir

$ mkdir data
$ setfacl -R -d -m u:gopher:7 data

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

一個實驗

現在讓我們嘗試data以 user 身分將檔案寫入目錄gopher

$ sudo -u gopher touch /tmp/somedir/data/afile
touch: cannot touch `/tmp/somedir/data/afile': Permission denied

看起來熟悉?

新增額外的 ACL 權限

這是因為您需要為使用者新增 ACL www-data,預設規則不是用於訪問,而是用於建立新檔案/目錄。

$ setfacl -R -m u:gopher:7 data

現在再檢查data目錄:

$ getfacl data
# file: data
# owner: root
# group: root
user::rwx
user:gopher:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:gopher:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

唯一的區別是我們現在有一個 ACL 表示用戶gopher有權rwx訪問:

user:gopher:rwx

重複實驗

嘗試再次向目錄寫入資料:

$ sudo -u gopher touch /tmp/somedir/data/afile
$

有效!仔細檢查產生的文件:

$ ls -l /tmp/somedir/data/afile
-rw-rw-r--+ 1 gopher gopher 0 Oct  7 21:36 /tmp/somedir/data/afile

相關內容