Linux

在 CentOS 6 上,如何讓使用者創建的文件從其父目錄繼承權限?

  • November 26, 2021

所以我們的伺服器是這樣設置的:

文件夾結構

/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 lbhbe創建的目錄drwxr-s---和文件的權限rwxr-s---,然而現實是這樣的:

lbh和root創建的文件和文件夾

導致每個工作人員都能夠寫入每個人自己的文件夾和文件,這正是我們試圖避免的。的umask是,普通使用者的root是。0022``umask``0002

我的問題:

  1. 為什麼使用者(like /lbh)在其個人目錄(like)下創建的文件lbh忽略drwxr-s--- 了個人文件夾的權限,預設為 (d)rwxrwsr-x
  2. 是否有安全的方法讓工作人員預設使用 (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>

在此之後,如果有人在其中創建文件或目錄(當然,如果他們被允許在那裡創建對象),該對象將獲得額外的 ACLuser:<username>:rwxgroup:<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 將影響後代,這是正確的繼承。

引用自:https://serverfault.com/questions/1079697