首頁 > linux教程 > Linux權限管理 閱讀:0更新時間:2020-03-28 00:59:45

Linux ACL權限設置(setfacl和getfacl)

通過上一節的學習,我們知道了什么是 ACL 權限,也了解了如何配置 linux 系統使其開啟 ACL 權限,本節來學習 ACL 設定文件訪問權限的具體方法。

設定 ACl 權限,常用命令有 2 個,分別是 setfacl getfacl 命令,前者用于給指定文件或目錄設定 ACL 權限,后者用于查看是否配置成功。

getfacl 命令用于查看文件或目錄當前設定的 ACL 權限信息。該命令的基本格式為:

[root@localhost ~]# getfacl 文件名

getfacl 命令的使用非常簡單,且常和 setfacl 命令一起搭配使用。

setfacl 命令可直接設定用戶或群組對指定文件的訪問權限。此命令的基本格式為:

[root@localhost ~]# setfacl 選項 文件名

表 1 羅列出了該命令可以使用的所用選項及功能。

表 1 setfacl 命令選項及用法
選項 功能
-m 參數 設定 ACL 權限。如果是給予用戶 ACL 權限,參數則使用 "u:用戶名:權限" 的格式,例如 setfacl -m u:st:rx /project 表示設定 st 用戶對 project 目錄具有 rx 權限;如果是給予組 ACL 權限,參數則使用 "g:組名:權限" 格式,例如 setfacl -m g:tgroup:rx /project 表示設定群組 tgroup 對 project 目錄具有 rx 權限。
-x 參數 刪除指定用戶(參數使用 u:用戶名)或群組(參數使用 g:群組名)的 ACL 權限,例如 setfacl -x u:st /project 表示刪除 st 用戶對 project 目錄的 ACL 權限。
-b 刪除所有的 ACL 權限,例如 setfacl -b /project 表示刪除有關 project 目錄的所有 ACL 權限。
-d 設定默認 ACL 權限,命令格式為 "setfacl -m d:u:用戶名:權限 文件名"(如果是群組,則使用 d:g:群組名:權限),只對目錄生效,指目錄中新建立的文件擁有此默認權限,例如 setfacl -m d:u:st:rx /project 表示 st 用戶對 project 目錄中新建立的文件擁有 rx 權限。
-R 遞歸設定 ACL 權限,指設定的 ACL 權限會對目錄下的所有子文件生效,命令格式為 "setfacl -m u:用戶名:權限 -R 文件名"(群組使用 g:群組名:權限),例如 setfacl -m u:st:rx -R /project 表示 st 用戶對已存在于 project 目錄中的子文件和子目錄擁有 rx 權限。
-k 刪除默認 ACL 權限。

setfacl -m:給用戶或群組添加 ACL 權限

回歸上一節案例,解決方案如下:
  • 老師使用 root 用戶,并作為 /project 的所有者,對 project 目錄擁有 rwx 權限;
  • 新建 tgroup 群組,并作為 project 目錄的所屬組,包含本班所有的班級學員(假定只有 zhangsan 和 lisi),擁有對 project 的 rwx 權限;
  • 將其他用戶訪問 project 目錄的權限設定為 0(也就是 ---)。
  • 對于試聽學員 st 來說,我們對其設定 ACL 權限,令該用戶對 project 擁有 rx 權限。

具體的設置命令如下:

[root@localhost ~]# useradd zhangsan
[root@localhost ~]# useradd lisi
[root@localhost ~]# useradd st
[root@localhost ~]# groupadd tgroup <-- 添加需要試驗的用戶和用戶組,省略設定密碼的過程
[root@localhost ~]# mkdir /project <-- 建立需要分配權限的目錄
[root@localhost ~]# chown root:tgroup /project <-- 改變/project目錄的所有者和所屬組
[root@localhost ~]# chmod 770 /project  <-- 指定/project目錄的權限
[root@localhost ~]# ll -d /project
drwxrwx---. 2 root tgroup 4096 Apr 16 12:55 /project
#這時st學員來試聽了,如何給她分配權限
[root@localhost ~]# setfacl -m u:st:rx /project
#給用戶st賦予r-x權限,使用"u:用戶名:權限" 格式
[root@localhost /]# cd /
[root@localhost /]# ll -d /project
drwxrwx---+ 2 root tgroup 4096 Apr 16 12:55 /project
#如果查詢時會發現,在權限位后面多了一個"+",表示此目錄擁有ACL權限
[root@localhost /]# getfacl project
#查看/prpject目錄的ACL權限
#file:project <--文件名
#owner:root <--文件的所有者
#group:tgroup <--文件的所屬組
user::rwx <--用戶名欄是空的,說明是所有者的權限
user:st:r-x <--用戶st的權限
group::rwx <--組名欄是空的,說明是所屬組的權限
mask::rwx <--mask權限
other::--- <--其他人的權限

可以看到,通過設定 ACL 權限,我們可以單獨給 st 用戶分配 r-x 權限,而無需給 st 用戶設定任何身份。

同樣的道理,也可以給用戶組設定 ACL 權限,例如:

[root@localhost /]# groupadd tgroup2
#添加新群組
[root@localhost /]# setfacl -m g:tgroup2:rwx project
#為組tgroup2紛配ACL權限
[root@localhost /]# ll -d project
drwxrwx---+ 2 root tgroup 4096 1月19 04:21 project
#屬組并沒有更改
[root@localhost /]# getfacl project
#file: project
#owner: root
#group: tgroup
user::rwx
user:st:r-x
group::rwx
group:tgroup2:rwx <-用戶組tgroup2擁有了rwx權限
mask::rwx
other::---

setfacl -d:設定默認 ACL 權限

既然已經對 project 目錄設定了 ACL 權限,那么,如果在這個目錄中新建一些子文件和子目錄,這些文件是否會繼承父目錄的 ACL 權限呢?執行以下命令進行驗證:

[root@localhost /]# cd project
[root@localhost project]# touch abc
[root@localhost project]# mkdir d1
#在/project目錄中新建了abc文件和d1目錄
[root@localhost project]#ll
總用量4
-rw-r--r-- 1 root root 01月19 05:20 abc
drwxr-xr-x 2 root root 4096 1月19 05:20 d1

可以看到,這兩個新建立的文件權限位后面并沒有 "+",表示它們沒有繼承 ACL 權限。這說明,后建立的子文件或子目錄,并不會繼承父目錄的 ACL 權限。

當然,我們可以手工給這兩個文件分配 ACL 權限,但是如果在目錄中再新建文件,都要手工指定,則顯得過于麻煩。這時就需要用到默認 ACL 權限。

默認 ACL 權限的作用是,如果給父目錄設定了默認 ACL 權限,那么父目錄中所有新建的子文件都會繼承父目錄的 ACL 權限。需要注意的是,默認 ACL 權限只對目錄生效。

例如,給 project 文件設定 st 用戶訪問 rx 的默認 ACL 權限,可執行如下指令:

[root@localhost /]# setfacl -m d:u:st:rx project
[root@localhost project]# getfacl project
# file: project
# owner: root
# group: tgroup
user:: rwx
user:st:r-x
group::rwx
group:tgroup2:rwx
mask::rwx
other::---
default:user::rwx <--多出了default字段
default:user:st:r-x
default:group::rwx
default:mask::rwx
default:other::---
[root@localhost /]# cd project
[root@localhost project]# touch bcd
[root@localhost project]# mkdir d2
#新建子文件和子目錄
[root@localhost project]# ll 總用量8
-rw-r--r-- 1 root root 01月19 05:20 abc
-rw-rw----+ 1 root root 01月19 05:33 bcd
drwxr-xr-x 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2
#新建的bcd和d2已經繼承了父目錄的ACL權限

大家發現了嗎?原先的 abc 和 d1 還是沒有 ACL 權限,因為默認 ACL 權限是針對新建立的文件生效的。

對目錄設定的默認 ACL 權限,可直接使用 setfacl -k 命令刪除。例如:

[root@localhost /]# setfacl -k project

通過此命令,即可刪除 project 目錄的默認 ACL 權限,讀者可自行通過 getfacl 命令查看。

setfacl -R:設定遞歸 ACL 權限

遞歸 ACL 權限指的是父目錄在設定 ACL 權限時,所有的子文件和子目錄也會擁有相同的 ACL 權限。

例如,給 project 目錄設定 st 用戶訪問權限為 rx 的遞歸 ACL 權限,執行命令如下:

[root@localhost project]# setfacl -m u:st:rx -R project
[root@localhost project]# ll
總用量 8
-rw-r-xr--+ 1 root root 01月19 05:20 abc
-rw-rwx--+ 1 root root 01月19 05:33 bcd
drwxr-xr-x+ 2 root root 4096 1月19 05:20 d1
drwxrwx---+ 2 root root 4096 1月19 05:33 d2
#abc和d1也擁有了ACL權限

注意,默認 ACL 權限指的是針對父目錄中后續建立的文件和目錄會繼承父目錄的 ACL 權限;遞歸 ACL 權限指的是針對父目錄中已經存在的所有子文件和子目錄會繼承父目錄的 ACL 權限。

setfacl -x:刪除指定的 ACL 權限

使用 setfacl -x 命令,可以刪除指定的 ACL 權限,例如,刪除前面建立的 st 用戶對 project 目錄的 ACL 權限,執行命令如下:

[root@localhost /]# setfacl -x u:st project
#刪除指定用戶和用戶組的ACL權限
[root@localhost /]# getfacl project
# file:project
# owner: root
# group: tgroup
user::rwx
group::rwx
group:tgroup2:rwx
mask::rwx
other::---
#st用戶的權限已被刪除

setfacl -b:刪除指定文件的所有 ACL 權限

此命令可刪除所有與指定文件或目錄相關的 ACL 權限。例如,現在我們刪除一切與 project 目錄相關的 ACL 權限,執行命令如下:

[root@localhost /]# setfacl -b project
#會刪除文件的所有ACL權限
[root@localhost /]# getfacl project
#file: project
#owner: root
# group: tgroup
user::rwx
group::rwx
other::---
#所有ACL權限已被刪除

beylze編程學院,一個分享編程知識和seo優化知識的網站。跟著beylze一起學習,每天都有進步。

通俗易懂,深入淺出,一篇文章只講一個知識點。

文章不深奧,不需要鉆研,在公交、在地鐵、在廁所都可以閱讀,隨時隨地漲姿勢。

文章不涉及代碼,不燒腦細胞,人人都可以學習。

當你決定關注beylze(公眾號:beylze),你已然超越了90%的其他從業者!

相關文章

優秀教程

国产亚洲欧美日韩