來源:sparkdev
www.cnblogs.com/sparkdev/p/5536868.html
ACL 是什麼
ACL的全稱是 Access Control List (訪問控制串列) ,一個針對檔案/目錄的訪問控制串列。它在UGO權限管理的基礎上為檔案系統提供一個額外的、更靈活的權限管理機制。它被設計為UNIX檔案權限管理的一個補充。ACL允許你給任何的用戶或用戶組設置任何檔案/目錄的訪問權限。
本文的演示環境為 ubuntu 16.04。
ACL有什麼用
既然是作為UGO權限管理的補充,ACL自然要有UGO辦不到或者很難辦到的本事,例如:
-
可以針對用戶來設置權限
-
可以針對用戶組來設置權限
-
子檔案/目錄繼承父目錄的權限
檢查是否支持ACL
ACL需要Linux內核和檔案系統的配合才能工作,當前我們能見到的大多數Linux發行版本預設都是支持的。但最好還是能夠先檢查一下:
sudo tune2fs –l /dev/sda1 |grep “Default mount options:”
Default mount options: user_xattr acl
我們能夠看到預設情況下(Default mount options:)已經加入 acl 支持了。
如何設置ACL
我們可以使用setfacl和getfacl命令來設置或觀察檔案/目錄的acl權限。
setfacl
引數不多,直接列出來了:
getfacl
getfacl 檔案/目錄名
下麵我們通過一些示例來演示 ACL 權限的基本用法。
針對用戶來設置權限
筆者系統中的當前用戶是 nick,再創建兩個用戶 tester 和 tester1 用來進行測試:
$ sudo adduser tester
$ sudo adduser tester1
創建檔案 aclfile,檢查其預設的權限信息:
把用戶切換為 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 權限。也就是說我們通過這種方式設置在目錄上的權限可以被子目錄遞迴的繼承下去。
更改 ACL 權限
-m 選項其實是在更改檔案和目錄的 ACL 權限
-
當一個用戶或組的 ACL 權限不存在時,-m 選項執行的是添加操作,
-
如果一個用戶或組的 ACL 權限已經存在時,-m 選項執行的是更新操作。
我們重新創建一個 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::,就會報錯。
刪除 ACL 權限
有添加就有刪除,我們可以通過 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 權限。這個行為對於目錄來說也是一樣的,這裡就不再演示了。
備份和恢復 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 權限全都恢復回來了!
●編號611,輸入編號直達本文
●輸入m獲取文章目錄
運維
更多推薦《18個技術類微信公眾號》
涵蓋:程式人生、演算法與資料結構、黑客技術與網絡安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。