Linux 文件權限
Linux系統中有句話叫做“everything is files”,這當然不是戲稱了,windows系統裏的mp3、avi、txt、exe、word等等格式的文件在Linux系統裏都是以文件形式存在,當然有人會說那Linux系統的文件不也是以 .mp3、 .txt結尾嗎?不是的,Linux系統裏這樣寫是爲了的系統操作人員方便辨認,把後面的 .mp3、 .txt刪了,也不影響文件本質(當然前提是編碼格式不變)。在Linux系統裏的文件權限分爲有r、w、x、s、t。
1. 查看文件權限
[root@localhost ~]# ll /app/house total 0 drwxrwx---. 2 root root 6 Jul 21 15:17 common
文件類型 所有者權限 用戶組權限 其他用戶權限 特殊權限 連接數 所有者 用戶組 大小 修改日期 文件名
d rwx rwx --- . 2 root root 6 Jul 21 15:17 common
a.文件類型:Linux文件一共有七種類型,分別是:- 普通文件、d 目錄文件、b 塊設備、c 字符設備、l 符號鏈接文件、p 管道文件pipe、s 套接字文件sock
b.所有者權限: 對於目錄來說,內容爲文件夾中的文件名列表 :r:可讀取文件名列表
w:可新建,刪除,重命名文件名
x:有進入文件夾的權限,若要執行文件夾的w權限,必須要先有進入文件夾的權限,所以要使用w權限,必須要有x權限
I.對於文件來說,內容爲文件內容本身:r:可讀取文件內容
w:可修改文件內容
x:可執行文件
II.權限可以用數字表示:r: 4
w:2
x: 1 例如 764 表示 rwxrw-r--
III.文件還有3種特殊權限 ,也可以用數字表示suid:4 s
sgid:2 s
sticky:1 t
IV.suid:當對於一個可執行的二進制文件作用了suid之後,任何人在執行該文件時,臨時擁有其所有人的權限,可設置改權限
[root@localhost ~]# vim cyn.txt (當執行這個腳本的時候該用戶會臨時有文件所有者的權限,由於過程比較繁雜,請自行測試,歡迎留言討論) #/bin/bash echo hello,my name is cyn [root@localhost ~]# chmod +x cyn.txt [root@localhost ~]# ./cyn.txt hello,my name is cyn. [root@localhost ~]# chmod u+s cyn.txt [root@localhost ~]# ll total 4 -rwsr-xr-x. 1 root root 38 Jul 21 17:29 cyn.txt
V.sgid:-當對於一個可執行的二進制文件作用了sgid之後,任何人在執行該文件時,臨時擁有其所有組的權限,可設置改權限
[root@localhost ~]# chmod g+s cyn.txt [root@localhost ~]# ll total 4 -rwsr-sr-x. 1 root root 38 Jul 21 17:29 cyn.txt(當執行該腳本的時候,會臨時有該文件所屬組的權限,可以自行測試,歡迎留言討論)
-當對於一個目錄作用了sgid權限之後,任何人在該目錄下所創建的文件的所屬組,均與該目錄的所屬組相同。比如A用戶要創建一個文件,這個文件會屬於A用戶所在的 A組,但是A用戶想把這個文件創建之後使其所屬組繼承與B目錄的所屬組,這個時侯B目錄(所屬組B組)設置 sgid權限的話,A用戶在B目錄下面創建文件,文件會自動屬於B組,設置 方法與上面二進制文件一樣
VI.sticky:對於一個目錄作用了sticky權限,該目錄下的文件僅其所屬人和目錄的所屬人及root可以刪除,比如在一個共享組裏任何人可以上傳文件,萬一有人誤操作把其他的人文件 刪了,這個時候爲了防止這種情況發生就可以設置sticky權限。
[root@localhost ~]# ls /tmp drwxrwxrwt 6 root root 4096 Jul 21 17:29 /tmp
c.用戶組權限: 同所有者權限
d.其他用戶權限: 不是文件所有者,也不屬於文件所屬用戶組的用戶,稱爲其他用戶,其他用戶權限若爲-,表示沒有相應的權限
e.特殊權限 :acl權限
[leonard@localhost ~]$ ls -l -rw-rw---- 1 cyn root 6 Jul 21 17:29 test.txt
在這裏說明了對於test.txt這個文件cyn用戶擁有rw-權限。所有屬於root組的用戶擁有rw-權限. 其他任何用戶對於文件沒有任何的權限,如果我們現在希望john這個用戶也可以對 test.txt 文件進行讀寫操作.,我自己大概會想到以下幾種辦法:
1). 給文件的other類別增加讀和寫的權限,這樣由於john會被歸爲other類別,那麼他也將擁有讀寫的權限。
2). 將john加入到root組。那麼john會被歸爲group類別,那麼他將擁有讀寫的權限。
3). 設置sudo, 使john能夠以cyn的身份對test.txt進行操作,從而獲得讀寫權限。
第一種做法的問題在於所有用戶都將對test.txt擁有讀寫操作,顯然這種做法不可取。
第二種做法的問題在於john被賦予了過多的權限.所有屬於admin組的文件,john都可以擁有其等同的權限了。
第三種做法雖然可以達到只限定john擁有對test.txt文件的讀寫權限.但是需要對sudoers文件進行嚴格的格式控制. 而且當文件數量和用戶很多的時候,這種方法就相當地不靈活了。
看來好像都沒有一個很好的解決方案. 其實問題就出在Linux 文件權限裏面,對於other的定義過於廣泛,以至於很難把權限限定於一個不屬於file owner和group的用戶身上. 那 麼 Access Control List (ACL)就是用來幫助我們解決這個問題的。
簡單地來說ACL權限就是可以設置特定用戶或者用戶組對於一個文件/文件夾的操作權限。ACl權限判斷順序 owner > acl user > group > other
可以設置用戶acl,也可以設置組acl權限。設置ACL setfacl ,查看ACL getfacl
[root@localhost ~]# mkdir -p /acltest/acl [root@localhost ~]# cd /acltest/ [root@localhost acltest]# ll total 0 drwxr-xr-x. 2 root root 6 Jul 21 20:03 acl [root@localhost acltest]# setfacl -Rm g:shuguo:rwx /acltest/ [root@localhost acltest]# getfacl /acltest/ getfacl: Removing leading '/' from absolute path names # file: acltest/ # owner: root # group: root user::rwx user:liubei:r-- group::r-x group:shuguo:rwx mask::rwx other::r-x [root@localhost acltest]# ll total 0 drwxrwxr-x+ 2 root root 6 Jul 21 20:03 acl
刪除ACL,可以逐條刪除setfacl -x,也可以一起刪除setfacl -b
[root@localhost acltest]# setfacl -x u:liubei /acltest/ [root@localhost acltest]# getfacl /acltest/ getfacl: Removing leading '/' from absolute path names # file: acltest/ # owner: root # group: root user::rwx group::r-x group:shuguo:rwx mask::rwx other::r-x [root@localhost acltest]# setfacl -b /acltest/ [root@localhost acltest]# getfacl /acltest/ getfacl: Removing leading '/' from absolute path names # file: acltest/ # owner: root # group: root user::rwx group::r-x other::r-x
設置未來文件的權限 ,所謂未來就是你下一個將要創建的文件的ACL權限,查看的時候會以default顯示。
[root@localhost acltest]# setfacl -Rm d:g:shuguo:rwx /acltest/ [root@localhost acltest]# getfacl /acltest/ getfacl: Removing leading '/' from absolute path names # file: acltest/ # owner: root # group: root user::rwx group::r-x other::r-x default:user::rwx default:group::r-x default:group:shuguo:rwx default:mask::rwx default:other::r-x
f.連接數:目錄的連接數最少爲2,本身和 . ,若還有n個子目錄,則連接數爲2+n,文件的連接數最少爲1,如果連接數爲0,則文件或者目錄不存在
g.所有者:一般爲文件的創建者,誰創建了該文件,就成爲該文件的所有者,可以修改該權限:
[root@localhost ~]# ll /app/house total 0 drwxrwx---. 2 root root 6 Jul 21 15:17 common [root@localhost ~]# chown liubei /app/house/common [root@localhost ~]# ll /app/house total 0 drwxrwx---. 2 liubei root 6 Jul 21 15:17 common
h.用戶組:當某個用戶創建了一個文件後,這個文件的所在用戶組就是該用戶所在的組,可以修改該權限:
[guanyu@localhost ~]$ getent group shuguo shuguo:x:1021:liubei,zhangfei,guanyu [guanyu@localhost ~]$ mkdir guanyu [guanyu@localhost ~]$ ll total 0 drwxr-xr-x. 2 guanyu shuguo 6 Jul 21 16:37 guanyu
i.文件容量:單位爲B
j.修改日期:創建這個文件的時間
k.文件名:文件的文件名
2.文件屬性操作
a.修改文件的屬主:chown
用法:chown 用戶名 文件/目錄名
-R 遞歸同時修改目錄下的子文件子目錄
--reference file1 file2 將file1的owner設置給file2
chown owner.group 或 owner:group 文件名 可以同時修改文件的owner和group (僅root用戶)
b.修改文件的group:chgrp
用法:chgrp 組名 文件/目錄名
owner可以修改文件的屬於組,但owner一定要屬於目標組
-R 遞歸同時修改目錄下的子文件子目錄
--reference file1 file2 將file1的owner設置給file2
3.文件權限操作
a.改變文件或目錄的權限:chmod
用法:chmod 權限 文件/目錄名
-R 遞歸同時修改目錄下的子文件子目錄
修改一類用戶的所有權限: 如u= g= o= ug= a= u=,g= (a=ugo 或=左邊省略)
修改一類用戶某位或某些位權限 u+ u- g+ g- o+ o- a+ a- + (+ 加入 - 除去 + 設置)
--reference file1 file2 將file1的owner設置給file2