題 如何從父目錄繼承新文件權限?


我有一個名為的目錄 data。然後我在用戶ID'robot'下運行一個腳本。機器人寫到 data 目錄和更新文件裡面。這個想法是 data 我和機器人都可以更新。

所以我設置了這樣的權限和所有者組

drwxrwxr-x  2 me robot-grp 4096 Jun 11 20:50 data

我和機器人都屬於'機器人 - grp'。我像父目錄一樣遞歸地更改權限和所有者組。

我經常上傳新文件到 data 目錄使用 rsync。不幸的是,我希望上傳的新文件不會繼承父目錄的權限。相反,它看起來像這樣

-rw-r--r-- 1 me users       6 Jun 11 20:50 new-file.txt

當機器人嘗試更新時 new-file.txt,由於缺少文件權限而失敗。

我不確定設置umask是否有幫助。在任何情況下,新文件都不會真正遵循它。

$ umask -S
u=rwx,g=rx,o=rx

我常常被Unix文件許可所困擾。我甚至有一個正確的計劃嗎?我正在使用Debian lenny。


81
2018-06-12 04:06


起源




答案:


您不希望更改系統的默認umask,這是一個安全風險。粘性位選項在某種程度上可以工作,但使用ACL是最好的方法。這比你想像的要容易。基本ACL的問題在於默認情況下它們不是遞歸的。如果在目錄上設置ACL,則只有該目錄中的文件才會繼承ACL。如果創建子目錄,則除非將ACL設置為recurse,否則它不會獲取父ACL。

首先,確保為目錄所在的捲啟用了ACL。如果你有 tune2fs,您可以執行以下操作:

# tune2fs -l /dev/sda1 | grep acl
Default mount options:    user_xattr acl

如果你沒有 tune2fs,然後檢查 fstabs

# cat /etc/fstab 
/dev/system/root        /                       ext3    defaults        1 1
/dev/system/home        /home                   ext3    defaults        1 2
/dev/storage/data       /data                   ext3    defaults        1 2
LABEL=/boot             /boot                   ext3    defaults        1 2

第4列說“默認”意味著在我的系統(CentOS 5.5)上,ACL已打開。如有疑問,請將其保留為默認值。如果您嘗試設置ACL並且錯誤輸出,請返回並在默認情況下將acl選項添加到/ etc / fstab: defaults,acl

據我所知,您希望用戶組中的每個人都具有對數據目錄的寫入權限。這是通過以下方式完成的:

setfacl -Rm g:users:rwX,d:g:users:rwX data/

51
2018-06-13 02:10



我使用了這個命令,但它沒有解決我的問題,我怎麼能撤消這個命令呢? - Itai Ganot
在ubuntu上有訣竅 sudo setfacl -Rm g:users:rwX,d:g:users:rwX /var/www/logs_or_something。有PHPUnit測試的問題。從運行測試apache用戶創建日誌文件後 www-data 無法寫/讀它們。 - s3m3n
@Itai Ganot - 根據 setfacl 手冊頁, -b 要么 --remove-all 刪除擴展ACL。 - jww
所以,你只需追加即可 setfacl -Rm g:users:rwX,d:g:users:rwX data/ 在......的最後 /etc/fstab? - 425nesp
@piña沒有。你對/ etc / fstab做的唯一改變是改變 defaults 至 defaults,acl。 setfacl 是您應該從終端運行的命令。 data/ 應該替換為要更改的目錄的路徑。 - Segfault


標記目錄setgid(g+s)會使新文件繼承目錄的組所有權,但是 -g rsync的選項將嘗試覆蓋此。


31
2018-06-12 04:13



setgid位僅使創建的文件繼承組/ if /創建新文件的人是該組的成員;如果創建用戶是所有者但不是該組的成員,或者該目錄是全局可寫的,則setgid位將不執行任何操作。並且仍需要將所有文件創建用戶的umask設置為允許適當的組訪問。 - dannysauer


其他答案適用於一般情況,但正如您提到rsync是問題的根源,您可能只需要調整其調用。

一開始,很受歡迎 -a flag使rsync複製權限;使用 -r 不是 -a 或添加 -no-p (沒有許可同步)和 -no-g (沒有組同步)。 rsync還支持 --chmod 用於更改新創建文件的權限的標誌。


4
2017-09-03 15:36





您的umask對於您想要的權限是錯誤的。你想要一個002的umask。你當前有一個022的umask。此外,關於使目錄setgid的註釋是正確的,但我不確定文件組所有權是否是你想要改變的。

Unix文件權限實際上是一個非常簡單的模型。我發現ACL完全讓自己感到困惑。 :-)


3
2018-06-12 04:43



“Unix文件權限實際上是一個非常簡單的模型。我發現ACL完全讓我自己感到困惑。” - 我有點感覺相反(但反正+1)。 ACL(以及允許/拒絕ACE)很簡單,Unix權限沒有意義。但這是來自一個遭受Postfix / Dovecot / Clam / SpamAssassin安裝的人。 - jww