天天看點

檔案的特殊權限

指令 : chattr

文法: chattr  [+-=][ASaci [檔案或者目錄名]

‘+-=’ : 分别為增加、減少、設定

‘A’ : 增加該屬性後,檔案或目錄的atime将不可被修改;

‘S’ : 增加該屬性後,會将資料同步寫入磁盤中;

‘a’ : 增加該屬性後,隻能追加不能删除,非root使用者不能設定該屬性;

‘c’ : 自動壓縮該檔案,讀取時會自動解壓;

‘i’ : 增加後,使檔案不能被删除、重命名、設定連結接、寫入、新增資料;

# chattr +i test2

# touch test2/test1

touch: 無法建立'test2/test1': 權限不夠

# chattr -i test2

# touch test2/test1

# chattr +i test2

# rm -f test2/test1

rm: 無法删除'test2/test1': 權限不夠

對 ‘test2’ 目錄增加 ‘i’ 權限後,即使是root賬戶也不能在 ‘test2’ 裡建立或删除test1檔案。

# chattr -i test2

# touch test2/test3

# ls test2

test1  test3

# chattr +a test2

# rm -f test2/test1

rm: 無法删除 'test2/test1': 不允許的操作

# touch test2/test4

# ls test2

test1  test3  test4

test2目錄增加 ‘a’ 權限後,隻可以在裡面建立檔案,而不能删除檔案。檔案同樣可以适用這些權限。

# chattr +a test2/test1

# echo '11111' > test2/test1

-bash: test2/test1: 不允許的操作

# echo '11111' >> test2/test1

# cat test2/test1

11111

# chattr +i test2/test3

# echo '11111' >> test2/test3

-bash: test2/test3: 權限不夠

# echo '11111' > test2/test3

-bash: test2/test3: 權限不夠

# rm -f test2/test3

rm: 無法删除'test2/test3': 權限不夠

指令 : lsattr

該指令用來讀取檔案或者目錄的特殊權限,文法為 lsattr  [-aR] [檔案/目錄名]

‘-a’ : 類似與ls 的-a 選項,即連同隐藏檔案一同列出;

‘-R’ : 連同子目錄的資料一同列出

# lsattr test2

-----a-------e- test2/test1

----i--------e- test2/test3

-------------e- test2/test4

# lsattr -aR test2

----i--------e- test2/.

-----a-------e- test2/test1

-------------e- test2/..

----i--------e- test2/test3

-------------e- test2/test4

set uid 和set gid 和 sticky bit

set uid :該權限針對二進制可執行檔案,使檔案在執行階段具有檔案所有者的權限。比如 passwd 這個指令就具有該權限。當普通使用者執行 passwd 指令時,可以臨時獲得 root 權限,進而可以更改密碼。

set gid:該權限針對目錄。目錄被設定這個權限後,任何使用者在此目錄下建立的檔案都具有和該目錄所屬的組相同的組。

sticky bit:可以了解為放删除位。一個檔案是否可以被某使用者删除,主要取決于該檔案所在目錄是否對該使用者具有寫權限。如果沒有寫權限,則這個目錄下的所有檔案都不能被删除,同時也不能添加新的檔案。如果希望使用者能夠添加檔案但不删除該目錄下其他使用者的檔案,則可以對父目錄增加該權限。設定該權限後,就算使用者對目錄具有寫權限,也不能删除其他使用者的檔案。

例如,passwd 指令設定了一個 set uid 權限,而/tmp 目錄則設定了一個 sticky bit 權限。檢視一下它們的權限:

# ls -l /usr/bin/passwd

-rwsr-xr-x. 1 root root 25980 2月  22 2012 /usr/bin/passwd

# ls -ld /tmp/

drwxrwxrwt. 5 root root 4096 10月 31 14:13 /tmp/

從上面你會發現:passwd 顯示的是 rws 而非傳統的 rwx ,用數字表示為 4755 。/tmp/顯示的 rwt 而非rwx ,用數字表示為1777。那麼這個4和1是如何計算出來的呢?當有特殊權限時,第一位數字可以是0   1(--t)   2(-s-)   3(-st)   4(s--)   5(s-t)   6(ss-)   7(sst)。

再回過頭來看passwd ,它是s--,是以是4;而/tmp/是--t ,是以是1;

配置這些特殊權限的方法和之前一樣。比如我想給一個檔案增加一個set uid 權限,那麼指令為" chmod u+s filename ",而去掉這個權限的指令則為" chmod u-s filename "。同理,想設定一個set gid 權限的指令為為 " chmod g+s dirname ",設定一個stick bit 權限的指令為 " chmod o+t dirname "。