是不是感覺linux檔案權限太複雜了,使用者、群組、檔案權限、預設權限、隱藏屬性、ACL,現在怎麼又來一個特殊權限。心疼頭髮三秒~。
我們來看一個檔案
ls /usr/bin/passwd -l -rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
發現沒有,怎麼出現了一個奇怪的東西s。這個s出現在了檔案擁有者的x上面,此時就被稱為Set UID,簡稱為SUID。如果出現在所屬群組的x上面,則表示SGID。如果是在其他人的x上面,則表示Sticky。
下面透過一個表格來解釋下各特殊權限的用處:
檔案 | ||
SUID | 此使用者將繼承此程式的擁有者權限 | |
SGID | 此使用者將繼承此程式的所屬群組權限 | |
Sticky | 無意義 |
我們知道,linux下每個使用者都可以修改自己的密碼,而root則可以修改所有使用者的密碼。那你有沒有想過,為什麼一般用戶也可以修改自己的密碼?密碼不是保存在/etc/shadow檔案中的麼?這個檔案對於普通使用者沒有寫入權限阿。
# ls -l /etc/shadow ---------- 1 root root 969 Sep 10 09:37 /etc/shadow
這就是SUID的用途了,一般使用者透過passwd指令來修改自己的密碼。執行期間,使用者會暫時擁有該檔案擁有者即root的權限,所以一般使用者可以修改自己的密碼。如果該檔案特殊權限為SGID,那麼執行期間就會擁有該檔案所屬群組的權限。
SGID除了可以作用於檔案外,還可以作用於目錄,注意,對於檔案和目錄,它的作用完全不同。我們透過一個場景來講解SGID對於目錄的作用。
下面,我們模擬一個場景:公司現在需要開發一個項目,原型圖已經給出,需要交給設計部門design進行設計。現在建立一個目錄project1_ps。 design部門所有人員對這個目錄下的檔案都有rwx權限。
我們知道,在linux中,當新建一個檔案或目錄時,擁有者是自己,所屬群組為自己所屬的群組。這樣一來,當設計師a新建了一個檔案時,其他使用者對這個檔案是其他人的權限,不符合我們的要求。所以,我們需要SGID來完成需求。
# groupadd design #创建design用户组 # useradd -G design --no-create-home dgn1 # 创建用户 # useradd -G design --no-create-home dgn2 # 创建用户 # id dgn1 uid=1003(dgn1) gid=1004(dgn1) 组=1004(dgn1),1003(design) # id dgn2 uid=1004(dgn2) gid=1005(dgn2) 组=1005(dgn2),1003(design) # mkdir design # 工作目录 # chgrp design design/ # chmod 2770 design/ <== 如果是SUID则是4770 # ll -d design/ drwxrws--- 2 root design 4096 5月 5 19:06 design/ # su dgn1 $ umask 0022 $ umask 0002 $ touch design/1.ps $ ls design -l 总用量 0 -rw-rw-r-- 1 dgn1 design 0 5月 5 19:31 1.ps <=== 新创建的文件默认组为design了###最後,我們來看看Sticky。這個非常好理解,目錄中每個使用者只能刪除、移動或改名自己的檔案或目錄。其實/tmp目錄就是要使用該特殊權限。 ###
# ll /tmp -d drwxrwxrwt. 9 root root 868352 Sep 13 08:24 /tmp
以上是linux系統下檔案的特殊權限的詳細內容。更多資訊請關注PHP中文網其他相關文章!