setfacl&&getfacl命令

  setfacl命令是用來在命令行裏設置ACL(訪問控制列表)。在命令行裏,一系列的命令跟隨以一系列的文件名。linux

選項

-b,--remove-all:刪除全部擴展的acl規則,基本的acl規則(全部者,羣組,其餘)將被保留。 -k,--remove-default:刪除缺省的acl規則。若是沒有缺省規則,將不提示。
-n,--no-mask:不要從新計算有效權限。setfacl默認會從新計算ACL mask,除非mask被明確的制定。
--mask:從新計算有效權限,即便ACL mask被明確指定。
-d,--default:設定默認的acl規則。
--restore=file:從文件恢復備份的acl規則(這些文件可由getfacl -R產生)。經過這種機制能夠恢復整個目錄樹的acl規則。此參數不能和除--test之外的任何參數一同執行。
--test:測試模式,不會改變任何文件的acl規則,操做後的acl規格將被列出。
-R,--recursive:遞歸的對全部文件及目錄進行操做。
-L,--logical:跟蹤符號連接,默認狀況下只跟蹤符號連接文件,跳過符號連接目錄。
-P,--physical:跳過全部符號連接,包括符號連接文件。
--version:輸出setfacl的版本號並退出。
--help:輸出幫助信息。
--:標識命令行參數結束,其後的全部參數都將被認爲是文件名
-:若是文件名是-,則setfacl將從標準輸入讀取文件名。

 選項-m-x後邊跟以acl規則。多條acl規則以逗號(,)隔開。選項-M-X用來從文件或標準輸入讀取acl規則。測試

  • 選項--set--set-file用來設置文件或目錄的acl規則,先前的設定將被覆蓋。

  • 選項-m(--modify)-M(--modify-file)選項修改文件或目錄的acl規則。

  • 選項-x(--remove)-X(--remove-file)選項刪除acl規則。

當使用-M,-X選項從文件中讀取規則時,setfacl接受getfacl命令輸出的格式。每行至少一條規則,以#開始的行將被視爲註釋。ui

當在不支持ACLs的文件系統上使用setfacl命令時,setfacl將修改文件權限位。若是acl規則並不徹底匹配文件權限位,setfacl將會修改文件權限位使其儘量的反應acl規則,並會向standard error發送錯誤消息,以大於0的狀態返回。spa

權限.net

文件的全部者以及有CAP_FOWNER的用戶進程能夠設置一個文件的acl。(在目前的linux系統上,root用戶是惟一有CAP_FOWNER能力的用戶)命令行

ACL規則rest

setfacl命令能夠識別如下的規則格式:code

[d[efault]:] [u[ser]:]uid [:perms]  指定用戶的權限,文件全部者的權限(若是uid沒有指定)。
[d[efault]:] g[roup]:gid [:perms]   指定羣組的權限,文件全部羣組的權限(若是gid未指定)
[d[efault]:] m[ask][:] [:perms]     有效權限掩碼
[d[efault]:] o[ther] [:perms]       其餘的權限

恰當的acl規則被用在修改和設定的操做中,對於uid和gid,能夠指定一個數字,也可指定一個名字。perms域是一個表明各類權限的字母的組合:讀-r-w執行-x,執行只適合目錄和一些可執行的文件。pers域也可設置爲八進制格式。blog

 自動建立的規則繼承

最初的,文件目錄僅包含3個基本的acl規則。爲了使規則能正常執行,須要知足如下規則。

  • 3個基本規則不能被刪除。
  • 任何一條包含指定的用戶名或羣組名的規則必須包含有效的權限組合。
  • 任何一條包含缺省規則的規則在使用時,缺省規則必須存在。

ACL的名詞定義

先來看看在ACL裏面每個名詞的定義,這些名詞我大多從man page上摘下來雖然有些枯燥,可是對於理解下面的內容仍是頗有幫助的。

ACL是由一系列的Access Entry所組成的,每一條Access Entry定義了特定的類別能夠對文件擁有的操做權限。Access Entry有三個組成部分:Entry tag type, qualifier (optional), permission。

 

咱們先來看一下最重要的Entry tag type,它有如下幾個類型:

ACL_USER_OBJ:至關於Linux裏file_owner的permission
ACL_USER:定義了額外的用戶能夠對此文件擁有的permission
ACL_GROUP_OBJ:至關於Linux裏group的permission
ACL_GROUP:定義了額外的組能夠對此文件擁有的permission
ACL_MASK:定義了ACL_USER, ACL_GROUP_OBJ和ACL_GROUP的最大權限 (這個我下面還會專門討論)
ACL_OTHER:至關於Linux裏other的permission

 

讓咱們來據個例子說明一下,下面咱們就用getfacl命令來查看一個定義好了的ACL文件:

[root@localhost ~]# getfacl ./test.txt
# file: test.txt
# owner: root
# group: admin
user::rw-
user:john:rw-
group::rw-
group:dev:r--
mask::rw- other::r--

 

前面三個以#開頭的定義了文件名,file owner和group。這些信息沒有太大的做用,接下來咱們能夠用--omit-header來省略掉。

user::rw-       定義了ACL_USER_OBJ, 說明file owner擁有read and write permission
user:john:rw-   定義了ACL_USER,這樣用戶john就擁有了對文件的讀寫權限,實現了咱們一開始要達到的目的
group::rw-      定義了ACL_GROUP_OBJ,說明文件的group擁有read and write permission
group:dev:r--   定義了ACL_GROUP,使得dev組擁有了對文件的read permission mask::rw-       定義了ACL_MASK的權限爲read and write
other::r--      定義了ACL_OTHER的權限爲read

 

從這裏咱們就能夠看出ACL提供了咱們能夠定義特定用戶和用戶組的功能,那麼接下來咱們就來看一下如何設置一個文件的ACL

 如何設置ACL文件

首先咱們仍是要講一下設置ACL文件的格式,從上面的例子中咱們能夠看到每個Access Entry都是由三個被號分隔開的字段所組成,

1.第一個就是Entry tag type。

user   對應了ACL_USER_OBJ和ACL_USER
group  對應了ACL_GROUP_OBJ和ACL_GROUP
mask   對應了ACL_MASK
other  對應了ACL_OTHER

2.第二個字段稱之爲qualifier,也就是上面例子中的john和dev組,它定義了特定用戶和擁護組對於文件的權限。這裏咱們也能夠發現只有user和group纔有qualifier,其餘的都爲空。

3.第三個字段就是咱們熟悉的permission了。它和Linux的permission同樣定義,這裏就很少講了。

下面咱們就來看一下怎麼設置test.txt這個文件的ACL讓它來達到咱們上面的要求。

一開始文件沒有ACL的額外屬性:

[root@localhost ~]# ls -l
-rw-rw-r-- 1 root admin 0 Jul 3 22:06 test.txt

[root@localhost ~]# getfacl --omit-header ./test.txt user::rw- group::rw- other::r--

 

咱們先讓用戶john擁有對test.txt文件的讀寫權限:

[root@localhost ~]# setfacl -m user:john:rw- ./test.txt
[root@localhost ~]# getfacl --omit-header ./test.txt
user::rw-
user:john:rw-
group::rw-
mask::rw-
other::r--

 這時咱們就能夠看到john用戶在ACL裏面已經擁有了對文件的讀寫權。這個時候若是咱們查看一下linux的permission咱們還會發現一個不同的地方。

[root@localhost ~]# ls -l ./test.txt
-rw-rw-r--+ 1 root admin 0 Jul 3 22:06 ./test.txt

在文件permission的最後多了一個+號,當任何一個文件擁有了ACL_USER或者ACL_GROUP的值之後咱們就能夠稱它爲ACL文件,這個+號就是用來提示咱們的。咱們還能夠發現當一個文件擁有了ACL_USER或者ACL_GROUP的值時ACL_MASK同時也會被定義。

 

接下來咱們來設置dev組擁有read permission:

[root@localhost ~]# setfacl -m group:dev:r-- ./test.txt [root@localhost ~]# getfacl --omit-header ./test.txt
user::rw-
user:john:rw-
group::rw-
group:dev:r--
mask::rw-
other::r--

 到這裏就完成了咱們上面講到的要求,是否是很簡單呢。

 

ACL_MASK和Effective permission

這裏須要重點講一下ACL_MASK,由於這是掌握ACL的另外一個關鍵,在Linux file permission裏面你們都知道好比對於rw-rw-r--來講, 當中的那個rw-是指文件組的permission. 可是在ACL裏面這種狀況只是在ACL_MASK不存在的狀況下成立。若是文件有ACL_MASK值,那麼當中那個rw-表明的就是mask值而再也不是group permission了。

 讓咱們來看下面這個例子:

[root@localhost ~]# ls -l
-rwxrw-r-- 1 root admin 0 Jul 3 23:10 test.sh

這裏說明test.sh文件只有file owner: root擁有read, write, execute/search permission。

admin組只有read and write permission,如今咱們想讓用戶john也對test.sh具備和root同樣的permission。

[root@localhost ~]# setfacl -m user:john:rwx ./test.sh
[root@localhost ~]# getfacl --omit-header ./test.sh
user::rwx user:john:rwx
group::rw-
mask::rwx
other::r--

這裏咱們看到john已經擁有了rwx的permission,mask值也被設定爲rwx,那是由於它規定了ACL_USERACL_GROUPACL_GROUP_OBJ的最大值,如今咱們再來看test.sh的Linux permission,它已經變成了:

[root@localhost ~]# ls -l
-rwxrwxr--+ 1 root admin 0 Jul 3 23:10 test.sh

 那麼若是如今admin組的用戶想要執行test.sh的程序會發生什麼狀況呢?它會被permission deny。緣由在於實際上admin組的用戶只有read and write permission,這裏當中顯示的rwx是ACL_MASK的值而不是group的permission。

因此從這裏咱們就能夠知道,若是一個文件後面有+標記,咱們都須要用getfacl來確認它的permission,以避免發生混淆。

下面咱們再來繼續看一個例子,假如如今咱們設置test.sh的mask爲read only,那麼admin組的用戶還會有write permission嗎?

[root@localhost ~]# setfacl -m mask::r-- ./test.sh
[root@localhost ~]# getfacl --omit-header ./test.sh
user::rwx
user:john:rwx   #effective:r--
group::rw-      #effective:r--
mask::r--
other::r--

這時候咱們能夠看到ACL_USER和ACL_GROUP_OBJ旁邊多了個#effective:r--,這是什麼意思呢?讓咱們再來回顧一下ACL_MASK的定義它規定了ACL_USERACL_GROUP_OBJACL_GROUP的最大權限。那麼在咱們這個例子中他們的最大權限也就是read only。雖然咱們這裏給ACL_USERACL_GROUP_OBJ設置了其餘權限,可是他們真正有效果的只有read權限。

 

這時咱們再來查看test.sh的Linux file permission時它的group permission也會顯示其mask的值(i.e. r--)

[root@localhost ~]# ls -l
-rwxr--r--+ 1 root admin 0 Jul 3 23:10 test.sh

 

 

Default ACL

上面咱們全部講的都是Access ACL,也就是對文件而言。下面我簡單講一下Default ACL。Default ACL是指對於一個目錄進行Default ACL設置,而且在此目錄下創建的文件都將繼承此目錄的ACL。

一樣咱們來作一個試驗說明,好比如今root用戶創建了一個dir目錄:

[root@localhost ~]# mkdir dir

他但願全部在此目錄下創建的文件均可以被john用戶所訪問,那麼咱們就應該對dir目錄設置Default ACL。

[root@localhost ~]# setfacl -d -m user:john:rw ./dir
[root@localhost ~]# getfacl --omit-header ./dir
user::rwx
group::rwx
other::r-x
default:user::rwx
default:user:john:rwx
default:group::rwx
default:mask::rwx
default: other::r-x

這裏咱們能夠看到ACL定義了default選項,john用戶擁有了default的read, write, excute/search permission。全部沒有定義的default都將從file permission裏copy過來,如今root用戶在dir下創建一個test.txt文件。

[root@localhost ~]# touch ./dir/test.txt
[root@localhost ~]# ls -l ./dir/test.txt
-rw-rw-r--+ 1 root root 0 Jul 3 23:46 ./dir/test.txt

[root@localhost ~]# getfacl --omit-header ./dir/test.txt
user::rw-
user:john:rw-
group::rwx #effective:rw-
mask::rw-
other::r--

這裏咱們看到在dir下創建的文件john用戶自動就有了read and write permission,

 

ACL相關命令

前面的例子中咱們都注意到了getfacl命令是用來讀取文件的ACL,setfacl是用來設定文件的Acess ACL。這裏還有一個chacl是用來改變文件和目錄的Access ACL and Default ACL,它的具體參數你們能夠去看man page。我只想說起一下chacl -B。它能夠完全刪除文件或者目錄的ACL屬性(包括Default ACL),好比你即便用了setfacl -x刪除了全部文件的ACL屬性,那個+號仍是會出如今文件的末尾,因此正確的刪除方法應該是用chacl -Bcp來複制文件的時候咱們如今能夠加上-p選項。這樣在拷貝文件的時候也將拷貝文件的ACL屬性,對於不能拷貝的ACL屬性將給出警告。

mv命令將會默認地移動文件的ACL屬性,一樣若是操做不容許的狀況下會給出警告。

 

須要注意的幾點

若是你的文件系統不支持ACL的話,你也許須要從新mount你的file system:

mount -o remount, acl [mount point]

若是用chmod命令改變Linux file permission的時候相應的ACL值也會改變,反之改變ACL的值,相應的file permission也會改變。

相關文章
相關標籤/搜索