1. 程式人生 > >在普通權限中,Linux用戶對文件的三種身份介紹

在普通權限中,Linux用戶對文件的三種身份介紹

接下來 完全 target get con 手工 出了 文件和目錄 iis

在普通權限中,Linux用戶對文件只有三種身份,就是屬主、屬組和其他人;每種用戶身份擁有讀(read)、寫(write)和執行(execute)三種權限。但是在實際工作中,這三種身份實在是不夠用,我們舉個例子來看看。
技術分享圖片
  圖 1 的根目錄中有一個 /project 目錄,這是班級的項目目錄。班級中的每個學員都可以訪問和修改這個目錄,老師也需要對這個目錄擁有訪問和修改IIS7-VPS大全權限,其他班級的學員當然不能訪問這個目錄。需要怎麽規劃這個目錄的權限呢?應該這樣:老師使用 root 用戶,作為這個目錄的屬主,權限為 rwx;班級所有的學員都加入 tgroup 組,使 tgroup 組作為 /project 目錄的屬組,權限是 rwx;其他人的權限設定為 0。這樣這個目錄的權限就可以符合我們的項目開發要求了。

  有一天,班裏來了一位試聽的學員 st,她必須能夠訪問 /project 目錄,所以必須對這個目錄擁有 r 和 x 權限;但是她又沒有學習過以前的課程,所以不能賦予她 w 權限,怕她改錯了目錄中的內容,所以學員 st 的權限就是 r-x。可是如何分配她的身份呢?變為屬主?當然不行,要不 root 該放哪裏?加入 tgroup 組?也不行,因為 tgroup 組的權限是 rwx,而我們要求學員 st 的權限是 r-x。如果把其他人的權限改為 r-x 呢?這樣一來,其他班級的所有學員都可以訪問 /project 目錄了。
  當出現這種情況時,普通權限中的三種身份就不夠用了。ACL 權限就是為了解決這個問題的。在使用 ACL 權限給用戶 st 陚予權限時,st 既不是 /project 目錄的屬主,也不是屬組,僅僅賦予用戶 st 針對此目錄的 r-x 權限。這有些類似於 Windows 系統中分配權限的方式,單獨指定用戶並單獨分配權限,這樣就解決了用戶身份不足的問題。
  ACL是Access Control List(訪問控制列表)的縮寫,不過在Linux系統中,ACL用於設定用戶針對文件的權限,而不是在交換路由器中用來控制數據訪問的功能(類似於防火墻)。
  開啟ACL權限
  在 CentOS 6.x 系統中 ACL 權限默認是開啟的,不需要手工開啟。不過,如果你的操作系統不是 CentOS 6.x,那該如何查看 ACL 權限是否開啟了呢?可以這樣查看:
  [root@localhost ——]# mount
  /dev/sda1 on /boot type ext4 (rw)
  /dev/sda3 on I type ext4 (rw)
  …省略部分輸出…
  #使用mount命令可以看到系統中已經掛載的分區,但是並沒有看到ACL權限的設置
  [root@localhost ——]# dumpe2fs -h /dev/sda3
  #dumpe2fs是查詢指定分區文件系統詳細信息的命令
  …省略部分輸出…
  Default mount options: user_xattr acl
  …省略部分輸出…
  其中,dumpe2fs 命令可選的選項及其含義如下:
  -h:僅顯示超級塊中的信息,而不顯示磁盤塊組的詳細信息;
  使用 mount 命令可以査看到系統中已經掛載的分區,而使用 dumpe2fs 命令可以査看到這個分區文件系統的詳細信息。大家可以看到,我們的 ACL 權限是 /dev/sda3 分區的默認掛載選項,所以不需要手工掛載。
  不過我的 Linux 系統如果沒有默認掛載,則可以手工掛載嗎?當然可以,執行如下命令:
  [root@localhost ——]# mount -o remount, acl /
  #重新掛載根分區,並加入ACL權限
  使用 mount 命令重新掛載,並加入 ACL 權限。不過使用此命令是臨時生效的。要想永久生效,需要修改 /etc/fstab 文件,命令如下:
  [root@localhost ——]#vi /etc/fstab
  UUID=c2ca6f57-b15c-43ea-bca0-f239083d8bd2 /ext4 defaults, acl 1 1
  #加入ACL權限
  [root@localhost ——]# mount -o remount /
  #重新掛載文件系統或重啟系統,使修改生效
  在你需要開啟 ACL 權限的分區行上(也就是說 ACL 權限針對的是分區),手工在 defaults 後面加入",acl"即可永久在此分區中開啟 ACL 權限。
  ACL權限設置
(1)ACL權限管理命令
  我們知道了 ACL 權限的作用,也知道了如何開啟 ACL 權限,接下來學習如何査看和設定 ACL 權限。命令如下:
  [root@localhost ——]# getfacle 文件名
  #查看ACL權限
  [root@localhost ——]# setfacl 選項 文件名
  #設定ACL權限
  選項:
  -m:設定 ACL 權限。如果是給予用戶 ACL 權限,則使用"u:用戶名:權限"格式賦予;如果是給予組 ACL 權限,則使用"g:組名:權限" 格式賦予;
  -x:刪除指定的 ACL 權限;
  -b:刪除所有的 ACL 權限;
  -d:設定默認 ACL 權限。只對目錄生效,指目錄中新建立的文件擁有此默認權限;
  -k:刪除默認 ACL 權限;
  -R:遞歸設定 ACL 權限。指設定的 ACL 權限會對目錄下的所有子文件生效;
(2)給用戶和用戶組添加ACL權限
  舉個例子,就來看看圖 1 中的權限怎麽分配。我們要求 root 是 /project 目錄的屬主,權限是 rwx;tgroup 是此目錄的屬組,tgroup 組中擁有班級學員 zhangsan 和 lisi,權限是 rwx;其他人的權限是 0。這時,試聽學員 st 來了,她的權限是 r-x。我們來看具體的分配命令。
  [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 1月19 04:21 /project/
  #查看一下權限,已經符合要求了
  #這時st學員來試聽了,如何給她分配權限
  [root@localhost ——]# setfacl -m u:st:rx /project/
  #給用戶st賦予r-x權限,使用"u:用戶名:權限" 格式
  [root@localhost /]# cd /
  [root@localhost /]# ll -d project/
  drwxrwx—+ 3 root tgroup 4096 1月19 05:20 project/
  #使用ls-l査詢時會發現,在權限位後面多了一個"+",表示此目錄擁有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::— <-其他人的權限
  大家可以看到,st 用戶既不是 /prpject 目錄的屬主、屬組,也不是其他人,我們單獨給 st 用戶分配了 r-x 權限。這樣分配權限太方便了,完全不用先辛苦地規劃用戶身份了。
  我想給用戶組賦予 ACL 權限可以嗎?當然可以,命令如下:
  [root@localhost /]# groupadd tgroup2
  #添加測試組
  [root@localhost /]# setfacl -m g:tgroup2:rwx project/
  #為組tgroup2紛配ACL權限,使用"g:組名:權限"格式
  [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::–
(3)最大有效權限mask
  mask 是用來指定最大有效權限的。mask 的默認權限是 rwx,如果我給 st 用戶賦予了 r-x 的 ACL 權限,mj 需要和 mask 的 rwx 權限"相與"才能得到 st 的真正權限,也就是 r-x “相與"rwxtj 出的值是 r-x,所以 st 用戶擁有 r-x 權限。
  如果把 mask 的權限改為 r–,和 st 用戶的權限相與,也就是 r–“相與"r-x 得出的值是 r–,st 用戶的權限就會變為只讀。大家可以這麽理解:用戶和用戶組所設定的權限必須在 mask 權限設定的範圍之內才能生效,mask權限就是最大有效權限。
  不過我們一般不更改 mask 權限,只要給予 mask 最大權限 rwx,那麽任何權限和 mask 權限相與,得出的值都是權限本身。也就是說,我們通過給用戶和用戶組直接賦予權限,就可以生效,這樣做更直觀。
  補充:邏輯與運算的運算符是"and”。可以理解為生活中所說的"並且”。也就是相與的兩個值都為真,結果才為真;有一個值為假,與的結果就為假。比如 A 相與 B,結果入表 2 所示。
  表 2 邏輯與運算
  A B and
  真 真 真
  真 假 假
  假 真 假
  假 假 假
  那麽兩個權限相與和上面的結果類似,我們以讀(r)權限為例,結果如表 3 所示。
  表 3 讀權限相與
  A B and
  r r r
  r - -
  - r -
  - - -
  所以,“rwx"相與"r-x”,結果是"r-x";“r–“相與"r-x”,結果是"r–”。
  修改最大有效權限的命令如下:
  [root@localhost /]# setfacl -m m:rx project/
  #設定mask權限為r-x,使用"m:權限"格式
  [root@localhost /]# getfacl project/
  #file:project/
  #owner:root
  #group:tgroup
  user::rwx
  group::rwx #effective:r-x
  mask::r-x
  #mask權限變為r-x
  other::–
(4)默認ACL權限和遞歸ACL權限
  我們已經給 /project 目錄設定了 ACL 權限,那麽,在這個目錄中新建一些子文件和子目錄,這些文件是否會繼承父目錄的 ACL 權限呢?我們試試吧。
  [root@localhost /]# cd /project/
  [root@localhost prq’ect]# touch abc
  [root@localhost prq’ect]# 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權限
  子文件 abc 和子目錄 d1 因為是後建立的,所以並沒有繼承父目錄的 ACL 權限。當然,我們可以手工給這??個文件分配 ACL 權限,但是如果在目錄中再新建文件,都要手工指定,則顯得過於麻煩。這時就需要用到默認 ACL 權限。
  默認 ACL 權限的作用是:如果給父目錄設定了默認 ACL 權限,那麽父目錄中所有新建的子文件都會繼承父目錄的 ACL 權限。默認 ACL 權限只對目錄生效。命令如下:
  [root@localhost /]# setfacl -m d:u:st:rx /project/
  #使用"d:u:用戶名:權限"格式設定默認ACL權限
  [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??: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 權限。遞歸是指父目錄在設定 ACL 權限時,所有的子文件和子目錄也會擁有相同的 ACL 權限。
  [root@localhost project]# setfacl -m u:st:rx -R/project/
  #-R遞歸
  [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 權限,格式是"setfacl-m d:u:用戶名:權限 文件名";遞歸 ACL 權限指的是針對父目錄中已經存在的所有子文件和子目錄繼承父目錄的 ACL 權限,格式是"setfacl-m u:用戶名: 權限 -R 文件名"。
(5)刪除ACL權限
  我們來看看怎麽刪除 ACL 權限,命令如下:
  刪除指定的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用戶的權限已被刪除
  刪除所有ACL權限:
  [root@localhost /]# setfacl -b project/
  #會刪除文件的所有ACL權限
  [root@localhost /]# getfacl project/
  #file: project/
  #owner: root
  # group: tgroup
  user::rwx
  group::rwx
  other::–
  #所有ACL權限已被刪除
  Linux公社的RSS地址:http

在普通權限中,Linux用戶對文件的三種身份介紹