前面我們知道了Linux中文件、目錄一般有rwx三種權限,但是請看下面命令的結果,我們可以發現了多了2個權限:s,t:




其中s權限當出現于用戶的x位置時被稱為SUID,當s權限出現于組用戶的x位置時被稱為SGID (而SGID又分為作用于文件還是目錄,SUID僅對文件有用)
那么這兩個權限有什么作用呢?簡單的概括起來:
①SUID允許執行該文件的用戶在運行時暫時擁有所有者的權限
②SGID允許執行該文件的用戶在運行時暫時擁有用戶組的權限
③如果SGID作用于目錄,則使用者在該目錄下創建的文件,其用戶組都和該目錄一樣
Example 1:修改passwd文件中用戶paul的密碼
我們知道/usr/bin/passwd文件的用戶是root,用戶組也是root,如果沒有s權限,那么光憑用戶paul的x權限我們只能執行而不能看到,更改這個文件的內容。但是實際上我們完全可以通過passwd命令來修改自己的密碼。








那么為什么我們不具備對passwd這個文件rw權限,卻能夠修改這個文件呢?原因就在于我們前面提到的s權限--SUID。從描述可以知道當paul用戶執行該文件時(x權限),可以暫時地獲得用戶root對這個文件的權限,用戶root對passwd是rwx權限,所以我們當然可以修改自己的密碼了。
但一旦我們執行完畢時這個權限就還回去了,如果我們cat這個文件我們會發現沒有權限顯示



不過SUID和SGID也不是隨便那個人,那個文件都可以用的,必須滿足下面兩個條件
①用戶對要執行的文件必須具備x權限
②SUID,SGID僅對二進制文件起作用
【2.SBIT】
SBIT權限就是前面我們看到的t權限,它只能作用于目錄,它的作用是:但用戶在該目錄下建立文件或目錄時,僅有用戶自己或root用戶有權刪除。其他人無法刪除,而用戶也無法刪除他人的目錄或文件。



我們看到/tmp目錄的x位置被替換成t了,這意味著這個目錄下的內容只有root用戶和創建者有權刪除。
Example 1:試驗SBIT權限
首先我們以paul用戶身份在/tmp目錄下建立一個文件test,并設置成為777權限。讓所有人可以修改文件。







然后我們以Oracle用戶身份分別嘗試刪除該文件和修改該文件








經過試驗我們發現兩個結果:
①我們不能以Oracle身份刪除test文件,即便/tmp目錄對其他用戶開放w權限
②我們可以Oracle身份修改test文件,因為我們對test文件設置了777權限
這就是SBIT權限的好處,即不會限制正常的刪除,又可以防止意外或惡意的刪除。
【3.如何設置特殊權限】
如何設置權限我們已經在前面提到過了,設置特殊權限也是同樣的。只是特殊權限在設置時是位于普通權限的前面,而且4代表SUID權限,2代表SGID權限,1代表SBIT權限。見下面例子:










注意最后一個7666權限的例子,大寫S和T和上面小寫的s和t不同,這是空的特殊權限的表示。因為本身666已經斷絕了所有人的執行權限,所以特殊權限也就沒有意思了。
(來自《鳥哥的私房菜》的例子)
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。