ACL的全稱是 Access Control List (訪問控制列表) ,一個針對文件/目錄的訪問控制列表。它在UGO權限管理的基礎上爲文件系統提供一個額外的、更靈活的權限管理機制。它被設計爲UNIX文件權限管理的一個補充。ACL容許你給任何的用戶或用戶組設置任何文件/目錄的訪問權限。linux
本文的演示環境爲 ubuntu 16.04。ubuntu
既然是做爲UGO權限管理的補充,ACL天然要有UGO辦不到或者很難辦到的本事,例如:工具
ACL須要Linux內核和文件系統的配合才能工做,當前咱們能見到的大多數Linux發行版本默認都是支持的。但最好仍是可以先檢查一下:測試
sudo tune2fs -l /dev/sda1 |grep "Default mount options:" Default mount options: user_xattr acl
咱們可以看到默認狀況下(Default mount options:)已經加入 acl 支持了。spa
咱們可使用setfacl和getfacl命令來設置或觀察文件/目錄的acl權限。.net
參數很少,直接列出來了:設計
setfacl [-bkRd] [{-m|-x} acl參數] 文件/目錄名 -m :配置後面的 acl 參數給文件/目錄使用,不可與 -x 合用; -x :刪除後續的 acl 參數,不可與 -m 合用; -b :移除全部的 ACL 配置參數; -k :移除默認的 ACL 參數; -R :遞歸配置 acl; -d :配置「默認 acl 參數」,只對目錄有效,在該目錄新建的數據會引用此默認值;
getfacl 文件/目錄名
下面咱們經過一些示例來演示 ACL 權限的基本用法。
3d
筆者系統中的當前用戶是 nick,再建立兩個用戶 tester 和 tester1 用來進行測試:rest
$ sudo adduser tester $ sudo adduser tester1
建立文件 aclfile,檢查其默認的權限信息:code
把用戶切換爲 tester,發現沒有寫文件的權限:
這是由於 other 沒有寫 aclfile 文件的權限。
下面咱們爲 tester 用戶賦予讀寫 aclfile 文件的權限:
$ setfacl -m u:tester:rw aclfile
修改爲功後再次以 tester 用戶的身份向 aclfile 文件寫入數據,此次已經能夠正常寫入了。查看 aclfile 文件的權限:
$ ll aclfile
貌似並無發生什麼變化,只是在描述權限的地方多出了一個 "+" 號。下面再看看 acl 權限:
$ getfacl aclfile
多出了一些信息,其中比較重要的是 user:tester:rw-,就是它讓用戶 tester 具備了讀寫 aclfile 的權限。
和針對用戶的設置幾乎同樣,只是把小寫的 u 換成小寫的 g 就好了。
這是一個很棒的例子,它能讓咱們建立的子文件或者子文件夾繼承父文件夾的權限設置!
$ mkdir mydir $ ll -d mydir $ setfacl -m d:u:tester:rwx mydir $ getfacl mydir
注意參數 d 在這裏起到了決定性的做用。下面是設置後的 mydir 目錄的權限屬性:
此次多出了一些以 default 開頭的行,這些 default 權限信息只能在目錄上設置,而後會被目錄中建立的文件和目錄繼承。下面分別在 mydir 目錄下建立文件 testfile 和目錄 testdir,並查看它們的 acl 權限:
$ touch testfile $ mkdir testdir $ getfacl testfile $ getfacl testdir
從上圖能夠看到文件 testfile 繼承了父目錄的 acl 權限,所以用戶 tester 對它有讀寫權限。下面再看看 testdir 目錄:
從圖中能夠看出,testdir 目錄不只繼承了 tester 的訪問權限,還繼承了父目錄上的 default 權限。也就是說咱們經過這種方式設置在目錄上的權限能夠被子目錄遞歸的繼承下去。
-m 選項實際上是在更改文件和目錄的 ACL 權限
咱們從新建立一個 aclfile 文件,經過下面的命令設置 tester 用戶對它的訪問權限:
$ setfacl -m u:tester:rwx aclfile
這時 -m 選項是在添加 ACL 權限。而後咱們修改 tester 用戶的權限,移除其對 aclfile 的執行權限:
$ setfacl -m u:tester:rw aclfile
這時 -m 選項是在更改現有的 ACL 權限。接下來再讓咱們試一下爲不一樣的用戶或組設置 ACL 權限:
$ setfacl -m g:tester1:rwx aclfile
此次是新添加了 group tester1 的權限,而且沒有影響 tester 用戶的權限。
--set 選項會先清除掉原有的 ACL 權限,而後添加新的權限
咱們接着設置 aclfile 文件的 ACL 權限:
$ setfacl --set u::rw,u:tester2:rwx,g::r,o::- aclfile
須要注意的是必定要包含 UGO 權限的設置,不能象 -m 同樣只包含 ACL 權限。o::- 是另外一個須要注意的地方,其完整的寫法是 other::-,就像 u::rw 的完整寫法是 user::rw- 同樣。一般咱們能夠把 "-" 省略,可是當權限位只包含 "-" 時,就至少要保留一個。若是寫成了o::,就會報錯。
有添加就有刪除,咱們能夠經過 setfacl 命令的 -x 選項來刪除指定用戶或組的 ACL 權限,還能夠經過 -b 選項來清除文件和目錄上全部的 ACL 權限。
咱們建立一個新的測試文件 aclfile,並設置下面的 ACL 權限:
$ setfacl -m u:tester:rwx,u:tester1:rw,g:tester2:rwx aclfile
下面經過 -x 選項刪除 group tester2 的 ACL 權限(注意命令中只指定了組的名稱而沒有指定權限信息):
$ setfacl -x g:tester2 aclfile
查看一下結果,發現下圖中已經沒有 group:tester2 的權限信息了:
下面經過 -b 選項一次性刪除 aclfile 上全部的 ACL 權限:
$ setfacl -b aclfile
-b 選項直接清除了文件上的全部 ACL 權限。這個行爲對於目錄來講也是同樣的,這裏就再也不演示了。
常見的文件操做命令 cp 和 mv 等都支持 ACL 權限,只是 cp 命令須要加上 -p 參數。可是 tar 等常見的備份工具不會保留目錄和文件的 ACL 權限信息。若是但願備份和恢復帶有 ACL 權限的文件和目錄,能夠先把 ACL 權限信息備份到一個文件裏,而後再用 -restore 選項來恢復這些信息。下面演示 ACL 權限的保存和恢復。咱們先建立下面的目錄結構:
並分別爲 acldir 目錄和 aclfile 文件設置 ACL 權限:
而後使用下面的命令導出 acldir 目錄的 ACL 權限信息並保存到文件 acldir.acl 文件中:
$ getfacl -R acldir > acldir.acl
接下來刪除掉 acldir 目錄的 ACL 權限:
$ setfacl -R -b acldir
如今 acldir 目錄及其子文件上的 ACL 權限都被刪除掉了。最後咱們再經過下面的命令把它們的 ACL 權限都恢復回來:
$ setfacl --restore acldir.acl
以前刪除的 ACL 權限全都恢復回來了!