初窺Linux之文件權限
一、用戶與用戶組
為了更好地理解文件權限,我們需要先有用戶和用戶組的概念。因為在Linux裡面,任何一個文件都具有“User(用戶)、Group(用戶組)及Others(其他用戶)”3種身份的個別權限。
1、用戶和文件所有者的概念
你用來登陸Linux主機的那個用戶名就是一個用戶,例如,root就是一個用戶,而Linux上存在很多的用戶。如果你在Linux上創建了一個文件,那麼默認情況下你就是這個文件的所有者。
2、用戶組的概念
有了用戶就可以區分不同的文件的所有者,也可以根據文件的所有者來限定用戶可不可以對文件進行讀寫或執行等操作,那為什麼還要有用戶組的概念呢?
原因很簡單,就是讓一些指定的用戶(非文件所有者),也能按照一定的權限訪問你的文件,而其他的人則不能訪問你的文件。而且設置用戶組也使這種權限的管理變得容易。
舉個例子來說,一個團隊A在進行項目開發,你是團隊A的成員,則你寫的文檔或者代碼,你的其他成員也需要能對其進行讀寫,則可以把團隊A的人加進一個用戶組,這個用戶組的人可以對這些文件進行讀寫,而其他的開發團隊,在沒有允許的情況下,是不能對你的團隊的代碼和文檔進行閱讀和修改。此外,每個用戶可以有多個用戶組的支持。
3、其他用戶(Others)的概念
既然文件有所屬的用戶組的話,那必然就有一些人是既不屬於這個用戶組,也不屬於文件所有者本身的用戶,例如上面例子中除團隊A之外的其他的開發團隊的用戶,就是屬於文件的其他用戶。
二、Linux文件屬性
在自己的主文件夾下,執行ls命令,得到下面的執行結果:
從上面的結果可以後到,屏幕上出現了7列數據,它們分別代表:
權限 連接數 所有者 用戶組 文件容量(B) 修改日期 文件名
1、詳細解說第一列——權限
可以看到第一列都是由10個字符組成,如下圖所示:
第一個字符表示文件類型,接下來的字符中,以3個為一組,且均以“rwx”的3個組合(r:read(可讀),w:write(可寫),x:execute(可執行)),無論是所有者對文件的權限、用戶組對文件的權限還是其他用戶對文件的權限,都是rwx,這個順序是不會變的,如果可讀、可寫、可執行,則相應的位置就分別為r、w、x,否則為-。
第一個字符表示文件類型,而文件類型主要有:
[d]:目錄
[-]:文件
[l]:連接文件
[b]:設備文件裡面的可供存儲的接口設備
[c]:設備文件裡面的串行端口設備
對於權限是怎麼理解的呢?舉個例子吧,如果第一列為-rwxr-xr--,則表示:該文件為普通文件,對文件所有者可對其進行讀寫和執行,而用戶組的成員,則只能對它進行讀和執行,而不能寫(修改),其他的用戶則只能進行讀操作。
而權限的設置除了可以用字母來表示之外,還能用數字表示,對照為r:4,w:2,x:1,-:0(化成二進制可知,其符合前綴碼規則),而顯示時,只顯示每組的累加值,如上例rwxr-xr--可以表示為754。
2、詳細解說目錄與文件權限的區別
對於用慣了windows的我們來說,並不是每一個文件都是可執行的,它與文件的後綴有關,可執行文件的後綴為.exe,而在Linux下,一個文件是否可執行,與後綴是沒有絕對關系的,而是由文件是否具有“x”這個權限來決定的。
而“w”代表你具有寫入、編輯、新增、修改文件內容的權限,卻不具備刪除該文件本身的權利。rwx主要針對文件的內容。
然而,從上面的文件類型可知,文件類型也可能是目錄,那麼對一個目錄進行寫和執行顯然是沒有意義的,那麼它到底意味著什麼呢?它與普通文件類型[-]又有什麼不同呢?
我們知道,文件是存放實際數據的所在,目錄主要的內容是記錄文件名列表,文件名與目錄有強烈的關聯。
所以,對於目錄來說,r表示具有讀取目錄結構列表的權限,可以查詢該目錄下的文件名數據,例如你用ls命令顯示目錄的內容列表。
對於目錄來說w可以說是強大的,它表示具有更改該目錄結構的權限,如新建新的目錄和文件,刪除已存在的文件與目錄(不論該文件的權限如何),將已存在的文件或目錄進行重命名,轉移該目錄內的文件和目錄位置等。
你可能會覺得x對於一個目錄來說總是怪怪的,但是它卻是非常有用的,目錄的x表示用戶能否進入該目錄成為工作目錄,如是否能使用cd命令切換到該目錄下。
值得注意的是:如果你對一個目錄具有r權限而沒有x權限,你能使用ls查看目錄下的文件列表,卻不能進入到該目錄,也就不能對目錄裡的任何文件進行操作,即使你對目錄中的文件具有rwx權限。
3、文件特殊權限:SUID,SGID,SBIT
當我們執行如下的ls命令時,我們可能會看到很奇怪的結果:
在第一列,中我們看到了上面介紹之外的文件權限屬性,s和t。
1)SUID
當s這個標志出現在文件所有者的x權限上時,如上面的第二個例子,則被稱為Set UID,簡稱SUID的特殊權限。
基本上SUID具有如下的限制和功能:
a、SUID權限僅對二進制程序有效,不能用在shell script上面,對目錄也是無效的;
b、執行者對於該程序需要具有x的可執行權限;
c、本權限在執行該程序的過程中有效;
d、執行者將具有該程序所有者的權限;
看到這裡,可能對於SUID還不是很理解,舉上面的例子來說,就是passwd這個程序是root這個用戶所有的,並屬於root用戶組,但是我們知道,對於普通用戶,他們還是能夠改變自己的密碼,這是為什麼呢?其原因在於:
1、passwd是一個可執行的二進制程序;
2、這個可執行文件在文件所有者的x權限上的標志是s,即設置了SUID;
3、普通用戶對於root用戶和root用戶組來說是其他用戶(Others),然而從文件的權限中我們可以知道,它支持其他用戶(Others)對其進行讀和執行的操作,注意,這點很重要,因為如果Others的權限(後三位)設置為r--,則普通的用戶就執行passwd這個程序了,即使它在文件所有者的x權限上的標志是s。(注:這個可執行權限要對應用戶的角色,在相應的權限中有x的權限,如上面的例子中,無論是文件所有者,用戶組,還是Others都具有x的權限。)
4、在執行passwd這個程序時,普通的用戶將會獲得passwd這個程序的所有者的權限,即root對該程序的權限,而不是Others或用戶組的權限;
5、但是這個權限僅在passwd這個程序執行的過程中才有效,程序執行完畢之後,普通用戶就不再擁有這種權限了;
2)SGID
相應地,當s出現在用戶組的x時則稱為Set GID,即SGID。SGID可以針對文件和目錄來設置
對於文件來說,SGID有如下限制和功能:
a、SGID對二進制程序有用;
b、程序執行者對於該程序來說,需要備x的權限;
c、執行者在執行的過程中將會獲得該程序用戶組的支持。
對於文件的權限和操作來說,基本上與SUID相同,只是它獲得的不是程序所有者的權限,而是它的用戶組的權限。
而SGID可用於目錄,對於目錄來說,SGID有如下的限制和功能:
a、用戶若對於此目錄具有r與x的權限,該用戶能夠進入此目錄;
b、用戶在此目錄下的有效用戶組將會變成該目錄的用戶組;
c、若用戶在此目錄下具有w的權限,則用戶所創建的新文件的用戶組與此目錄的用戶組相同。
3)SBIT
SBIT只針對目錄有效,它對目錄的作用是:
當用戶對於此目錄具有w,x權限,即具有定稿的權限時,用戶在該目錄下創建文件或目錄,只有自己與root才有權利刪除該文件。
三、修改文件權限
修改文件權限的常用命令有:
chgrp:修改文件所屬用戶組
chown:修改文件所有者
chmod:修改文件的權限
至於這些命令的用法,這裡不詳述,要用時,可以找一下男人——man。
注:文件的三種特殊權限也可以用數學表示,4為SUID,2為SGID,1為SBIT,如-rwsr-xr-x,按照前面的計算我們知道,原先為755,由於它有SUID特殊權限,所以就變成了4755了。