歡迎您光臨本站 註冊首頁

Linux文件系統的管理所有權和許可權(2)

←手機掃碼閱讀     火星人 @ 2014-03-09 , reply:0
變更許可權
添加許可權
假設您創建一個 「Hello world」 的 shell 腳本.當您第一次創建腳本時,它通常是不可執行的.使用 chmod 命令和 x 選項添加執行許可權,如清單 5 所示.
清單 5. 創建可執行的 shell 腳本
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello.sh[ian@echidna ~]$ ls -l hello.sh-rw-rw-r--. 1 ian ian 20 Nov 30 13:05 hello.sh[ian@echidna ~]$ ./hello.shbash: ./hello.sh: Permission denied[ian@echidna ~]$ chmod x hello.sh[ian@echidna ~]$ ./hello.shHello world![ian@echidna ~]$ ls -l hello.sh-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh您可以按類似的方法使用 r 來設置讀許可權,使用 w 設置寫許可權.事實上,您可以聯合使用 r、w 和 x.例如,使用 chmod rwx 將會設置文件的所有讀、寫和執行許可權.chmod 會添加尚未設置的許可權.
可選性
您在上面的例子中可能已經注意到,執行許可權被設置給所有者、組 和 其他.為了更具可選性,您可以給模式描述加前綴 u 來設置用戶許可權,g 來設置組許可權,還有 o 為其他人設置.需要指出的是 a 設置所有用戶的許可權,這就相當於忽略它.清單 6 顯示了如何添加用戶和組寫和執行許可權到 shell 腳本的其他副本.
清單 6. 有選擇性地添加許可權
[ian@echidna ~]$ echo 'echo "Hello world!"'>hello2.sh[ian@echidna ~]$ chmod ug xw hello2.sh[ian@echidna ~]$ ls -l hello2.sh-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh刪除許可權
有時您需要刪除許可權,而不單單是添加.簡單地將 改變為 -,就能刪除任何已設置的指定許可權.清單 7 顯示了如何刪除兩個 shell 腳本上的其他用戶的所有許可權.
清單 7. 刪除許可權
[ian@echidna ~]$ ls -l hello*.sh
-rwxrwxr--. 1 ian ian 20 Nov 30 13:08 hello2.sh
-rwxrwxr-x. 1 ian ian 20 Nov 30 13:05 hello.sh
[ian@echidna ~]$ chmod o-xrw hello*.sh
[ian@echidna ~]$ ls -l hello*.sh
-rwxrwx---. 1 ian ian 20 Nov 30 13:08 hello2.sh
-rwxrwx---. 1 ian ian 20 Nov 30 13:05 hello.sh請注意,您可以一次改變一個或者多個文件的許可權.正如在 topic 103 的文章中看到其他命令一樣,您甚至可以使用 -R(或者 --recursive)選項在目錄和文件上進行遞歸操作.
設置許可權
現在已經可以添加或者刪除許可權了,您可能會想,怎樣才能只設置一些特殊許可權.使用 = 替換 或者 - 來完成這個動作.要在上述腳本中設置許可權,這樣其他用戶就沒有訪問權利,您可以使用 chmod o= hello* 替換我們用於刪除許可權的命令.


如果您想對用戶、組合或其他設置不同的許可權,您可以通過逗號分隔不同的表達;例如,ug=rwx,o=rx,或者您可以使用稍後提到的數字許可權.
八進位許可權
目前為止,您都是使用符號(ugoa 和 rxw)來指定許可權.每組中有三個可能的許可權.您還可以使用八進位取代符號設置許可權.按這種方法設置的許可權使用高達 4 位八進位數字.討論屬性時,我們會查看第 1 個數字.第 2 個數字定義了用戶許可權,第 3 個是組許可權,第 4 個是其他許可權.這三個數字中的每一個都通過添加所需的許可權設置來構建:讀(4),寫(2)和執行(1).在 清單 5 中的 hello.sh 例子中,創建的腳本有許可權 -rw-r--r--,相當於八進位 644.設置每個人的執行許可權將模式改為 755.
當您想要一次設置所有許可權,而不給予每個組相同許可權時,設置使用數字許可權非常方便.使用 表 2 作為一個方便的八進位許可權參考.
表 2. 數字許可權
符號 八進位
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0
suid 和 sgid
Linux 許可權模型有兩個特殊的訪問模式,名為 suid(設置用戶 id)和 sgid(設置組 id).當可執行的程序設置為 suid 訪問模式,它就會開始運行,好像是由文件所有者啟動而不是由真正啟動它的用戶啟動.類似的,設置為 sgid 訪問模式,程序就會運行,好像啟動用戶屬於文件組,而不屬於他所有的組.可以單獨或者同時設置兩個訪問模式.
清單 8 顯示了可執行的 passwd 由 root 所有:
清單 8. /usr/bin/passwd 上的 suid 訪問模式
[ian@echidna ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 34368 Apr 6 2010 /usr/bin/passwd
請注意,在用戶的許可權三件套中 x 的位置上有一個 s.這就表示,對這個特定的程序來說,suid 和可執行位已經被設置.所以,當 passwd 運行時,它就會像 root 用戶使用完全的 superuser 訪問一樣載入它運行,而不是作為想運行該程序的用戶. passwd 和 root 訪問一起運行,所以它可以修改 /etc/passwd.
suid 和 sgid 位與長目錄清單中用戶和組的 x 佔據相同的空間.如果文件是可執行的,suid 或 sgid 位如果已設置,將會顯示為小寫的 s,否則就顯示為大寫的 S.


雖然 suid 和 sgid 很便利,甚至在很多環境下是必需的,但是這些訪問模式不適當的使用會造成系統安全上的漏洞.您要盡量少地使用 suid 程序.passwd 命令是少數 必須 為 suid 的命令之一.
設置 suid 和 sgid
suid 和 sgid 位使用字母 s 在符號上進行設置和重設;例如,u s 設置 suid 訪問模式,g-s 刪除 sgid 模式.在八進位格式中,suid 在第一位(高階)為值 4,而 sgid 是值 2.
目錄和 sgid
當一個目錄使用 sgid 模式時,在這個目錄中創建的任何文件和目錄將會繼承目錄的組 id.這個對那些被從事同一項目的一組人使用的目錄樹極為有用. 清單 9 顯示了用戶 greg 任何設置一個 development 組所有用戶都能使用的目錄,以及一個示例,用戶 gretchen 如何在目錄上創建一個文件.正如所創建的,文件 gretchen.txt 允許組成員編輯文件,因此 gretchen 使用 chmod g-w 來取消組的寫功能.
清單 9. sgid 訪問模式和目錄
[greg@echidna ~]$ mkdir lpi101
[greg@echidna ~]$ chmod g ws lpi101
[greg@echidna ~]$ ls -ld lpi101
drwxrwsr-x. 2 greg development 4096 Nov 30 13:30 lpi101/
[greg@echidna ~]$ su - gretchen
Password:
[gretchen@echidna ~]$ touch ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-rw-r--. 1 gretchen development 0 Nov 30 14:12 home/greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ chmod g-w ~greg/lpi101/gretchen.txt
[gretchen@echidna ~]$ ls -l ~greg/lpi101/gretchen.txt
-rw-r--r--. 1 gretchen development 0 Nov 30 14:12 /home/greg/lpi101/gretchen.txtdevelopment 組的任何成員現在都能夠在用戶 greg 的 lpi101 目錄上創建文件了.正如 清單 10 所示,組的其他用戶不能升級文件 gretchen.txt.但是,他們有對目錄的寫許可權,因此可以刪除文件.
清單 10. sgid 訪問模式和文件所有權
[gretchen@echidna ~]$ su - tom
Password:[tom@echidna ~]$ echo "something" 》 ~greg/lpi101/gretchen.txt-bash: /home/greg/lpi101/gretchen.txt: Permission denied[tom@echidna ~]$ rm ~greg/lpi101/gretchen.txtrm: remove write-protected regular empty file `/home/greg/lpi101/gretchen.txt'? y[tom@echidna ~]$ ls -l ~greg/lpi101/total 0粘貼位
您剛看到了任何有目錄寫許可權的人如何刪除目錄中的文件.這對一個工作組項目是可接受的,但是對全球共享的文件空間,例如 /tmp 目錄,是不希望的.幸運的是,有解決方案.


剩下的訪問模式為就稱為粘貼 位.用符號表示就是 t,用數字錶示就是八進位位的高階為 1.它顯示在其他用戶的可執行標識中(的字元)的長目錄清單, suid 和 sgid 的大小寫意義相同.如果設置一個目錄,它只允許有所有權的用戶或者 superuser(root)刪除或者解除文件鏈接.清單 11 顯示了用戶 greg 如何在他的 lpi101 目錄上設置粘貼位,還顯示了這個位設置用於 /tmp.
清單 11. 粘貼目錄
[greg@echidna ~]$ chmod t lpi101
[greg@echidna ~]$ ls -ld lpi101 /tmp
drwxrwsr-t. 2 greg development 4096 Nov 30 14:16 lpi101
drwxrwxrwt. 24 root root 12288 Nov 30 14:22 /tmp在以前,UNIX? 系統曾在文件上使用粘貼位在交換空間囤積可執行文件,避免重新載入.現代 Linux 內核忽略了粘貼位,如果它是設置給文件的.
訪問模式的總結
表 3 總結了這裡討論的 3 種訪問模式的符號和八進位表示.
表 3. 訪問模式
訪問模式 符號 八進位
suids with u 4000
sgids with g 2000
sticky t 1000
將這些和早先的許可權信息結合在一起,您可以看到對應 greg 的 lpi101 許可權和 drwxrwsr-t 訪問模式的完整的八進位表示是 3775.雖然 ls 命令不顯示八進位許可權,您可以使用 find 命令進行顯示,如清單 12清單 12 所示.
清單 12. 可列印的符號和八進位許可權
[greg@echidna ~]$ find . -name lpi101 -printf "%M %m %fn"drwxrwsr-t 3775 lpi101
不可變文件
訪問模式和許可權提供了廣泛的控制,限制了誰可以在文件和目錄上做什麼.但是,它們對有些事情也不能避免,如 root 用戶對文件的無心刪除.雖然這不在 LPI Topic 104.5 的範圍內,但是在提供額外功能的文件系統上還是有些可用的附加屬性.其中之一就是不可變 屬性.設置完成後,即使是 root 用戶也不能刪除文件,直到屬性解除.
使用 lsattr 命令查看文件或者目錄是否設置了不可變標識(或者任何其他屬性).要將一個文件設置為不可變,使用 chattr 命令和 -i 標識.
清單 13清單 13 顯示了用戶 root 可以創建一個不可變文件,但是不能刪除它,直到不可變標識被刪除.
清單 13. 不可變文件
[root@echidna ~]# touch keep.me
[root@echidna ~]# chattr i keep.me


[root@echidna ~]# lsattr keep.me
----i--------e- keep.me
[root@echidna ~]# rm -f keep.me
rm: cannot remove `keep.me': Operation not permitted
[root@echidna ~]# chattr -i keep.me
[root@echidna ~]# rm -f keep.me變更不可變標識需要 root 授權,或者最少 CAP_LINUX_IMMUTABLE 功能.使文件不可變通常是安全或者入侵檢測工作的一部分.見功能使用頁面(man capabilities)了解更多信息.
文件創建屏蔽
創建一個新文件時,創建進程就會指明新文件的許可權.通常,所需的模式是 0666,它使文件可由任何人讀和寫.目錄默認為 0777.但是,這個寬鬆的創建會受到 umask 值的影響,這個值指明了用戶不想自動授予新創建的文件或者目錄什麼許可權.系統使用 umask 值來減少原始請求的許可權.您可以使用 umask 查看 umask 設置,如清單 14清單 14 所示.
清單 14. 顯示八進位 umask
[ian@echidna ~]$ umask
0002
請記得,umask 指定了那個許可權不被授予.在 Linux 系統上,用戶沒有專用組的的情況下,umask 通常默認為 0022,它可以從新文件中刪除組和其他寫許可權.用戶有專用組的情況下(例如這些例子中使用的在 Fedora 系統上),umask 通常默認為 0002,它刪除了其他用戶的寫許可權.使用 -S 選項來從符號上顯示 umask,以顯示哪個許可權被允許的形式.
使用 umask 命令設置一個 unmask 並顯示.所以,如果您想要保持文件更專有,並且不允許所有組或者其他人訪問新創建的文件,就是可以使用 umask 值 0077.或者從符號上,使用 umask u=rwx,g=,o= 進行設置,如清單 15清單 14 所示.
清單 15. 設置 umask
[ian@echidna ~]$ umask -S
u=rwx,g=rwx,o=rx
[ian@echidna ~]$ umask u=rwx,g=,o=
[ian@echidna ~]$ umask
0077
[ian@echidna ~]$ touch newfile
[ian@echidna ~]$ ls -l newfile
-rw-------. 1 ian ian 0 Nov 30 15:40 newfile
設置文件所有者和組
文件組
要變更文件的組,使用 chgrp 命令和組名,以及一個或者多個文件名.如果您喜歡,還可以使用組編號.普通用戶必須擁有文件,同時是文件要變更到的組的組員.root 用戶可以將文件變更到任意組.清單 16清單 16 顯示了一個例子.
清單 16. 變更組的所有權
[ian@echidna ~]$ touch file{1,2}


[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian ian 0 Nov 30 15:54 file2
[ian@echidna ~]$ chgrp development file1
[ian@echidna ~]$ chgrp 505 file2
[ian@echidna ~]$ ls -l file*
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file1
-rw-rw-r--. 1 ian development 0 Nov 30 15:54 file2正如該教程中的許多其他命令,chgrp 有一個 -R 選項,允許將變更遞歸應用到所有所選的的文件和子目錄中.
默認組
當您學習之前的 訪問模式 時,您就了解了在目錄上設置 sgid 模式如何導致創建在該目錄下的新文件屬於目錄的組,而不是屬於創建該文件的用戶所在的組.
您還可以使用 newgrp 命令來暫時地將您的初級組變更到您所在的其他組.創建一個新的 shell,當您退出 shell 時,之前的組就能恢復,如清單 17清單 17 所示.
清單 17. 使用 newgrp 來暫時改變默認組
[ian@echidna ~]$ groups
ian development editor
[ian@echidna ~]$ newgrp development
[ian@echidna ~]$ groups
development ian editor
[ian@echidna ~]$ touch file3
[ian@echidna ~]$ ls -l file3
-rw-r--r--. 1 ian development 0 Nov 30 16:00 file3
[ian@echidna ~]$ exit
[ian@echidna ~]$ groups
ian development editor文件所有者
root 用戶可以使用 chown 命令變更文件的所有權.在它最簡單的形式中,語法和 chgrp 命令類似,除了使用用戶名或者數字 id,而不是組名或者 id.文件的組也可能通過在用戶名或者 id 之後添加一個冒號和組名或者 id 來同時變更.如果只有給出冒號,那麼就使用用戶的默認組.一般來說,-R 選項會遞歸地應用變更.清單 18清單 18 給出了一個例子.
清單 18. 使用 chown 變更文件所有權
[ian@echidna ~]$ touch file4
[ian@echidna ~]$ su -
Password:
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 ian ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown greg ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 greg ian 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown tom:gretchen ~ian/file4
[root@echidna ~]# ls -l ~ian/file4
-rw-rw-r--. 1 tom gretchen 0 Nov 30 16:04 /home/ian/file4
[root@echidna ~]# chown :tom ~ian/file4
[root@echidna ~]# ls -l ~ian/file4


-rw-rw-r--. 1 tom tom 0 Nov 30 16:04 /home/ian/file4指定用戶和組的較早版本使用點,而不是冒號.當名稱中包含點時,這個可能會造成誤解,所以已經不再推薦.
Linux 上的文件和目錄許可權介紹就到此為止.


[火星人 ] Linux文件系統的管理所有權和許可權(2)已經有507次圍觀

http://coctec.com/docs/linux/show-post-50117.html