在 CentOS 6 上,如何讓使用者創建的文件從其父目錄繼承權限?
所以我們的伺服器是這樣設置的:
/asic
是我們大項目的文件夾,/200T
是該大項目的子項目,下面的文件夾/200T
是/lbh
每個從事該子項目的工作人員的個人目錄。/asic
,/200T
,/lbh
都是由 root 創建的,然後由 root 通過和root
重新配置它們的屬性。和分別屬於組和,而屬於工作人員的使用者帳戶並屬於組。chmod -R``chown -R``/asic``/200T``root``asic``200T``/lbh``lbh``asic
這個想法是,所有工作人員都可以看到其中的內容,但
/asic
他們不能對這兩個目錄具有寫訪問權限——如果他們想創建一些東西,他們必須在自己的目錄中執行此操作(等等) )。當一個工作人員在他們自己的目錄中創建內容時,我們希望同一子項目的其他工作人員能夠讀取該新內容,但不會意外修改它。例如,剛剛在. 子項目上的另一個人 ( )應該能夠讀取但不能寫入它們。如果要修改它們,他必須將它們複製到自己的目錄中,然後再這樣做。/200T``asic``200T``/lbh``lbh``testbench.v``/results``/asic/200T/lbh``glj``200T``/asic/200T/lbh/testbench.v``/asic/200T/lbh/results``glj``/asic/200T/glj
為了達到上面的目的,我們需要預設to
lbh
be創建的目錄drwxr-s---
和文件的權限rwxr-s---
,然而現實是這樣的:導致每個工作人員都能夠寫入每個人自己的文件夾和文件,這正是我們試圖避免的。的
umask
是,普通使用者的root
是。0022``umask``0002
我的問題:
- 為什麼使用者(like
/lbh
)在其個人目錄(like)下創建的文件lbh
忽略drwxr-s---
了個人文件夾的權限,預設為(d)rwxrwsr-x
?- 是否有安全的方法讓工作人員預設使用 (d)rwxr-s— 創建文件和文件夾?要求每個使用者每次都手動操作
chmod
太麻煩了,我擔心更改預設umask
值會導致新的意外問題。非常感謝!
編輯: lbh 和 root 創建的文件的文件夾結構和權限如下所示:
[lbh@<machine> lbh]$ ls -al total 16 drwxr-s---. 4 lbh 200T 4096 Oct 1 02:40 . drwxr-sr-x. 4 root 200T 4096 Oct 1 02:18 .. drwxrwsr-x. 2 lbh 200T 4096 Oct 1 02:26 aaa_lbh drwxr-sr-x. 2 root 200T 4096 Oct 1 02:26 aaa_root -rw-rw-r--. 1 lbh 200T 0 Oct 1 02:38 file_lbh.txt -rw-r--r--. 1 root 200T 0 Oct 1 02:40 file_root.txt [lbh@<machine> lbh]$ pwd /asic/200T/lbh [lbh@<machine> lbh]$ cd .. [lbh@<machine> 200T]$ ls -al total 16 drwxr-sr-x. 4 root 200T 4096 Oct 1 02:18 . drwxr-x---. 3 root asic 4096 Oct 1 02:16 .. drwxr-sr-x. 2 root 200T 4096 Oct 1 02:18 aaa drwxr-s---. 4 lbh 200T 4096 Oct 1 02:40 lbh [lbh@<machine> 200T]$ pwd /asic/200T [lbh@<machine> 200T]$
目錄和
getfacl
文件的結果如下:[lbh@<machine> Desktop]$ getfacl /asic getfacl: Removing leading '/' from absolute path names # file: asic # owner: root # group: asic user::rwx group::r-x other::--- [lbh@<machine> Desktop]$ getfacl /asic/200T/ getfacl: Removing leading '/' from absolute path names # file: asic/200T/ # owner: root # group: 200T # flags: -s- user::rwx group::r-x other::r-x [lbh@<machine> Desktop]$ getfacl /asic/200T/lbh getfacl: Removing leading '/' from absolute path names # file: asic/200T/lbh # owner: lbh # group: 200T # flags: -s- user::rwx group::r-x other::--- [lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_lbh/ getfacl: Removing leading '/' from absolute path names # file: asic/200T/lbh/aaa_lbh/ # owner: lbh # group: 200T # flags: -s- user::rwx group::rwx other::r-x [lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/aaa_root/ getfacl: Removing leading '/' from absolute path names # file: asic/200T/lbh/aaa_root/ # owner: root # group: 200T # flags: -s- user::rwx group::r-x other::r-x [lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/file_lbh.txt getfacl: Removing leading '/' from absolute path names # file: asic/200T/lbh/file_lbh.txt # owner: lbh # group: 200T user::rw- group::rw- other::r-- [lbh@<machine> Desktop]$ getfacl /asic/200T/lbh/file_root.txt getfacl: Removing leading '/' from absolute path names # file: asic/200T/lbh/file_root.txt # owner: root # group: 200T user::rw- group::r-- other::r-- [lbh@<machine> Desktop]$ touch hello.txt [lbh@<machine> Desktop]$ mkdir hi [lbh@<machine> Desktop]$ ls -al total 12 drwxr-xr-x. 3 lbh lbh 4096 Oct 9 17:28 . drwx------. 36 lbh lbh 4096 Oct 9 17:21 .. -rw-rw-r--. 1 lbh lbh 0 Oct 9 17:27 hello.txt drwxrwxr-x. 2 lbh lbh 4096 Oct 9 17:28 hi [lbh@<machine> Desktop]$ getfacl hi # file: hi # owner: lbh # group: lbh user::rwx group::rwx other::r-x [lbh@<machine> Desktop]$ getfacl hello.txt # file: hello.txt # owner: lbh # group: lbh user::rw- group::rw- other::r-- [lbh@<machine> Desktop]$
Linux不支持權限繼承,所以你不能做你在問題主題中提出的問題。
您可以做的最好的事情是設置將應用於所有新創建的文件和目錄的*預設 POSIX ACL 。*這不是繼承,只是預設值:
setfacl -m default:user:<username>:rwx <dir> setfacl -m default:group:<groupname>:rwx <dir>
在此之後,如果有人在其中創建文件或目錄(當然,如果他們被允許在那裡創建對象),該對象將獲得額外的 ACL
user:<username>:rwx
和group:<groupname>:rwx
. 您可以通過設置<username>
和<groupname>
空白來設置所有者和組所有者的預設權限。此“預設”只能在目錄上設置,因為沒有必要將其應用於文件。以這種方式設置的權限也會被 umask 屏蔽,因此如果在 umask 中刪除了某個位,則該位將從權限中刪除。例如,當你創建一個文件時,如果你不給它可執行位,它就不會成為可執行的(如預期的那樣)。創建的子目錄也將設置相同的“預設”ACL,因此其後代也將設置這些 ACL。您必須在創建後刪除或更改子目錄上的 ACL 才能停止此傳播。
使用 . 檢查 ACL
getfacl <dir>
。當然,可能有幾個這樣的預設值(看起來你最終必須有幾個規則);至少,我遇到的要求總是要求至少存在兩個預設組 ACL)。您不能這樣設置“預設文件所有者”,所有者將始終設置為創建程序有效的 uid。預設情況下,group-owner 將設置為程序 gid,但您可以通過使用父目錄上的setgid位來更改它:
chmod g+s <dir>
之後,在該目錄中創建的任何對象將預設複製其組所有者,即使創建使用者不屬於該組。這個 setgit 位傳播到子目錄。
所有者可以將 group-owner 設置為他們所屬的任何組。如果他們不屬於由 setgid 派生的組,他們可以將他們的文件組所有者更改為他們所屬的任何組,但之後他們將無法將其更改回 setgid 值。
我想再次明確指出,這不是繼承,這是設置不完全相同的預設值。如果您之後更改父對像上的某些內容,則已創建的對象將始終保留其在 Linux 中的權限。
例如,在 Windows 中,當您將子對象 ACL 設置為“繼承”時,更改父 ACL 將影響後代,這是正確的繼承。