問題
在《Unix高級編程》第4.9章節中描述了函數chmod()的參數mode常量值

當中S_ISUID、S_ISGID、S_ISVTX三個常量讓人困惑.
分析
通過查閱文檔,發現這幾個權限叫做強制位(s權限)和粘滯位(t權限)。
一、s權限
包含S_ISUID、S_ISGID兩個常量在內,叫做強制位權限,作用在於設置使文件在執行階段具有文件所有者的權限,相當於臨時擁有文件所有者的身份. 典型的文件是passwd. 如果一般用戶執行該文件, 則在執行過程中, 該文件可以獲得root權限, 從而可以更改用戶的密碼.
ls -al /usr/bin/passwd -rwsr-xr-x 1 pythontab pythontab 32988 2018-03-16 14:25 /usr/bin/passwd
兩個常量的值是:
| oct | dec | |
| S_ISUID | 4000 | 2048 |
| S_ISGID | 2000 | 1024 |
即分別是第12位和第11位的掩碼.
設置suid:將相應的權限位之前的那一位設置為4;
設置guid:將相應的權限位之前的那一位設置為2;
兩者都置位:將相應的權限位之前的那一位設置為4+2=6.
設置一個文件運行時具備文件擁有者UID的身份:
chmod 4755 test
設置一個文件運行時具備文件擁有者GID的身份:
chmod 2755 test
設置一個文件運行時以上兩者兼備的身份:
chmod 6755 test
注意:在設置s權限時文件屬主、屬組必須先設置相應的x權限,否則s權限並不能正真生效(c h m o d命令不進行必要的完整性檢查,即使不設置x權限就設置s權限,chmod也不會報錯,當我們ls -l時看到rwS,大寫S說明s權限未生效)
二、t權限
這個常量的值是:
| oct | dec | |
| S_ISVTX | 1000 | 512 |
即是第10位的掩碼,不過有一點挺奇怪是,在centos7.0下標准頭文件sys/stat.h卻沒有定義這個常量,但是在文件系統中這個標志位是真實存在的.
設置一個文件夾運行時具備t權限:
chmod 1777 test
t權限:要刪除一個文檔,您不一定要有這個文檔的寫權限,但您一定要有這個文檔的上級目錄的寫權限。也就是說,您即使沒有一個文檔的寫權限,但您有這個文檔的上級目錄的寫權限,您 也能夠把這個文檔給刪除,而假如沒有一個目錄的寫權限,也就不能在這個目錄下創建文檔。
怎樣才能使一個目錄既能夠讓任何用戶寫入文檔,又不讓用戶刪除這個目錄下他人的文檔,t權限就是能起到這個作用。t權限一般只用在目錄上,用在文檔上起不到什么作用。
在一個目錄上設了t權限位后,(如/home,權限為1777)任何的用戶都能夠在這個目錄下創建文檔,但只能刪除自己創建的文檔(root除外),這就對任何用戶能寫的目錄下的用戶文檔 啟到了保護的作用。
可以通過chmod +t filename 來設置t權限
在這再總結一下
s或S(SUID,Set UID):
可執行的文件搭配這個權限,便能得到特權,任意存取該文件的所有者能使用的全部系統資源。請注意具備SUID權限的文件,黑客經常利用這種權限,以SUID配上root帳號擁有者,無聲無息地在系統中開扇后門,供日后進出使用。
t或T(Sticky):
/tmp和 /var/tmp目錄供所有用戶暫時存取文件,亦即每位用戶皆擁有完整的權限進入該目錄,去瀏覽、刪除和移動文件。
