找回密碼
 立即註冊
搜索
熱搜: 活動 交友 discuz
查看: 810|回復: 2

Linux ACL 檔案權限設定 setfacl、getfacl 指令使用教學與範例

[複製鏈接]

257

主題

38

回帖

1138

積分

管理員

積分
1138
發表於 2023-6-11 19:07:31 | 顯示全部樓層 |閱讀模式

介紹如何在 Linux 系統上使用 setfacl 與 getfacl 更改與查詢檔案 ACL 細部權限設定。

查看 ACL 權限

若要查看指定檔案或目錄的 ACL 權限設定,可以使用 getfacl 指令:

# 查看檔案 ACL 權限
getfacl myfile.txt
# file: myfile.txt
# owner: ubuntu
# group: ubuntu
user::rw-
group::rw-
other::r--

修改 ACL 設定

setfacl 在設定檔案或目錄的 ACL 權限時,可以透過以下的權限格式來指定 ACL 權限。

語法說明範例
u:使用者:權限使用者權限u:myuser:rx
user:使用者:權限使用者權限(同上)user:myuser:rx
g:群組:權限群組權限g:mygroup:rx
group:群組:權限群組權限(同上)group:mygroup:rx
o:權限其他使用者權限o:rx
other:權限其他使用者權限(同上)other:rx
m:權限有效權限m:rx
mask:權限有效權限(同上)mask:rx

若要修改檔案的 ACL 權限,可以使用 setfacl 搭配 -m 或 --modify 參數,並指定 ACL 權限。例如授予 myuser 使用者讀取與執行(rx)權限:

# 授予 myuser 使用者 rx 權限
setfacl -m u:myuser:rx myfile.txt

授予 mygroup 群組讀取與執行(rx)權限:

# 授予 mygroup 群組 rx 權限
setfacl -m g:mygroup:rx myfile.txt

我們也可以透過 ACL 來禁止特定使用者存取檔案:

# 禁止 myuser 使用者存取
setfacl -m u:myuser:- myfile.txt

移除指定 ACL 權限

若要移除指定的 ACL 權限,可以使用 -x 參數,移除 ACL 權限時可不需要指定權限內容:

# 移除 myuser 使用者 ACL 權限
setfacl -x u:myuser myfile.txt

# 移除 mygroup 群組 ACL 權限
setfacl -x g:mygroup myfile.txt

清除所有 ACL 設定

如果想要清除指定檔案的所有 ACL 設定,可以使用 -b 或 --remove-all 參數:

# 移除檔案所有 ACL 設定
setfacl -b myfile.txt

若要清除指定目錄中所有檔案或子目錄的任何 ACL 設定,可以再加上 -R 或 --recursive 參數,以遞迴的方式移除 ACL 設定:

# 遞迴移除目錄下所有檔案所有 ACL 設定
setfacl -Rb myfolder

有效權限範圍

setfacl 可以搭配遮罩(mask)來設定 ACL 的有效權限範圍,任何人的 ACL 權限都不能超過此範圍,超過的部分都無效。

舉例來說,假設既有的檔案已經授予 myuser 使用者 rx 權限:

# 授予 myuser 使用者 rx 權限
setfacl -m u:myuser:rx myfile.txt

如果希望指定檔案對任何人都只開放讀取的權限,就可以這樣設定遮罩:

# 設定遮罩,只開放讀取權限
setfacl -m m:r myfile.txt

設定遮罩之後,超出遮罩範圍的權限就會失效:

# 查看檔案 ACL 權限
getfacl myfile.txt
# file: myfile.txt
# owner: ubuntu
# group: ubuntu
user::rw-
user:myuser:r-x                 #effective:r--
group::rw-                      #effective:r--
mask::r--
other::r--

當遮罩設定之後,會顯示每個 ACL 權限設定的有效權限,這裡的 effective:r-- 就代表有效的權限只有讀取而已。

繼承 ACL 設定

如果希望在特定目錄之下,所有新建立的檔案都可以自動繼承特定的 ACL 權限設定,可以在目錄上加上預設的 ACL 權限,預設 ACL 權限的表示法就是在一般 ACL 權限之前加上 d: 或 default:

# 設定目錄預設 ACL 權限
setfacl -m d:u:myuser1:rx myfolder
setfacl -m d:u:myuser2:rx myfolder

設定好預設 ACL 權限之後,在目錄中建立的新檔案就會自動繼承這些 ACL 權限:

# 建立新檔案
touch myfolder/myfile.txt

# 查看檔案 ACL 權限
getfacl myfolder/myfile.txt
# file: myfolder/myfile.txt
# owner: ubuntu
# group: ubuntu
user::rw-
user:myuser1:r-x                #effective:r--
user:myuser2:r-x                #effective:r--
group::rwx                      #effective:rw-
mask::rw-
other::r--

若要清除預設的 ACL 權限設定,可以使用 -k 或 --remove-default 參數:

# 移除預設 ACL 權限設定
setfacl -k myfolder

複製 ACL 設定

若要將 file1 的 ACL 權限設定複製到 file2,可以使用以下指令:

# 複製 ACL 權限設定
getfacl file1 | setfacl --set-file=- file2

若要將 myfolder 目前的 ACL 權限設定,直接設定為預設的 ACL 權限,讓以後新增的檔案自動繼承,可以執行以下指令:

# 將目前 ACL 權限設定為預設 ACL 權限
getfacl --access myfolder | setfacl -d -M- myfolder

257

主題

38

回帖

1138

積分

管理員

積分
1138
 樓主| 發表於 2023-6-11 19:29:50 | 顯示全部樓層
用法:setfacl [-bkndRLP] { -m|-M|-x|-X ... } 文件 ...
    -m, --modify=acl       修改文件的當前 ACL
    -M, --modify-file=file 從文件中讀取 ACL 條目進行修改
    -x, --remove=acl       從文件的 ACL 中刪除條目
    -X, --remove-file=file 讀取 ACL 條目以從文件中刪除
    -b, --remove-all         刪除所有擴展 ACL 條目
    -k, --remove-default  刪除默認 ACL
        --set=acl              設置文件的 ACL,替換當前的 ACL
        --set-file=file         讀取 ACL 條目以從文件中設置
        --mask                 重新計算有效權限掩碼
    -n, --no-mask           不重新計算有效權限掩碼
    -d, --default             操作應用於默認 ACL
    -R, --recursive          遞歸到子目錄
    -L, --logical              邏輯遍歷,跟隨符號鏈接
    -P, --physical            物理行走,不跟隨符號鏈接
        --restore=file       恢復 ACL(與 getfacl -R 相反)
        --test                  測試模式(不修改 ACL)
    -v, --version             打印版本並退出
    -h, --help                 這個幫助文本

257

主題

38

回帖

1138

積分

管理員

積分
1138
 樓主| 發表於 2023-6-16 05:58:38 | 顯示全部樓層
在 linux 中使用 setfacl 授予对目录的单独权限
通常,我们使用 chmod 和 chown 来授予用户或者组明智的权限和对 linux 中目录和文件的所有权,但同样,如果我们想对任何特定目录上的特定用户或者组授予某些特殊权限,那么上述两个命令就无能为力。

在这种情况下,“setfacl”实用程序起着至关重要的作用并且非常有用。
使用“setfacl”,我们可以根据用户或者组名对任何特定目录或者文件授予个人权限。

语法:

为任何用户设置权限
  1. # setfacl -m u:username:permission /path/to/directory
複製代碼


为任何组设置权限
  1. # setfacl -m g:groupname:permission /path/to/directory
複製代碼


查看权限
  1. # getfacl /path/to/directory
複製代碼


删除任何用户的个人 acl
  1. # setfacl -x 用户名 /path/to/directory
複製代碼


删除所有由 setfacl 添加的 acl
  1. # setfacl -b /path/to/directory
複製代碼


删除任何目录上的默认 acl
  1. # setfacl -d /path/to/directory
複製代碼


示例
为用户 jack 添加对 mydata 目录具有读取和执行权限的 acl
  1. # setfacl -m u:jack:r-x /mydata
複製代碼


在任何目录上为组管理员添加 acl
  1. # setfacl -m g:admin:rwx /mydata
複製代碼


在所有子目录上以递归方式添加 acl
  1. # setfacl -Rm -u:jack:r-x /mydata/
複製代碼


查看 mydata 上的 acl 条目
  1. # getfacl /mydata
  2. # file: new
  3. # owner: root
  4. # group: root

  5. user:jack:r-x
  6. group:admin:rwx
  7. group::r-x
  8. mask::r-x
  9. other::r-x

  10. # ls -l/| grep mydata
  11. drwxr-xr-x+ 2 root root 4096 Oct 3 16:49 mydata
複製代碼

因此,在这里我们可以看到在目录的权限部分的最后添加了“+”号,这意味着该目录上的 acl 处于活动状态。

删除目录中特定的 acl
  1. # setfacl -x u:jack /mydata
複製代碼


删除目录中所有 acl
  1. # setfacl -b /mydata
複製代碼


您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

Archiver|手機版|小黑屋|DoIT 科技論壇

GMT+8, 2025-6-15 19:55 , Processed in 0.018482 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回復 返回頂部 返回列表