
1. 用戶與權限的基本概念在 Linux 系統中每個文件和目錄都屬于一個用戶owner和一個用戶組group。權限就是對這三類身份分別設定的用戶user / owner文件的擁有者通常是創建者。用戶組group文件所屬的組組內所有用戶共享組權限。其他人other既不是擁有者也不屬于該組的其他所有用戶。這三類身份各自擁有三種基本權限權限對文件的意義對目錄的意義r讀可以查看文件內容可以列出目錄中的文件列表lsw寫可以修改文件內容可以在目錄中創建、刪除文件x執行可以執行該文件如程序、腳本可以進入該目錄cd訪問目錄內文件2. 查看權限ls -l我們用 ls -l 來查看文件的詳細權限。例如$ ls -l main.cpp -rw-r--r-- 1 alice developers 2048 Jun 30 10:00 main.cpp第一列 -rw-r--r-- 就是權限字符串我們來拆解一下- rw- r-- r--① ② ③ ④① 文件類型- 表示普通文件d 目錄l 符號鏈接等。② 用戶權限3位rw- → 可讀可寫不可執行③ 組權限3位r-- → 可讀不可寫不可執行④ 其他人權限3位r-- → 可讀不可寫不可執行后面的 alice 是所有者developers 是所屬組。3. 修改權限chmod3.1 符號模式用 u用戶、g組、o其他人、a所有人配合 、-、 來增減權限chmod ux run.sh # 給擁有者增加執行權限 chmod go-w file.txt # 去掉組和其他人的寫權限 chmod arx script.sh # 所有人只有讀和執行權限 chmod o-rwx secret.txt # 把其他人的所有權限刪除3.2 數字模式最常用每種權限對應一個數字r4w2x1。三組權限分別用一個 0-7 的數字表示。每種權限對應一個數字r4w2x1。三組權限分別用一個 0-7 的數字表示。數字二進制權限0000---1001--x2010-w-3011-wx4100r--5101r-x6110rw-7111rwx例如我們想讓一個文件擁有者讀、寫、執行 → 7組讀、執行 → 5其他人無權限 → 0命令就是chmod 750 myprogram常見組合755目錄或可執行文件的標配自己全權限別人只讀和執行644普通文件默認權限自己讀寫別人只讀700私人腳本或密鑰僅自己可訪問4. 修改所有者和組chown / chgrpchown 改變所有者可同時改組chown alice file.txt # 把所有者改為 alice chown alice:developers file.txt # 同時改所有者和組chgrp 只改組chgrp developers file.txt修改權限通常需要 root 或文件所有者身份。5. 默認權限與 umask新建文件或目錄時系統會根據一個叫做 umask 的值來屏蔽部分權限。默認權限滿值減去 umask 值就是最終權限。文件默認滿值是 666因為一般不讓新文件有執行權限目錄是 777。查看當前 umask$ umask 0022 # 后三位是八進制掩碼第一位是特殊權限位暫時不管以 umask 022 為例新文件666 - 022 644rw-r--r--新目錄777 - 022 755rwxr-xr-x可以臨時修改 umaskumask 002 # 現在新文件變成 664組內可寫6. 特殊權限SUID、SGID、Sticky Bit粘滯位除了 rwx 之外還有三個特殊權限位它們通常用數字 4SUID、2SGID、1Sticky表示放在常規權限數字的前面。6.1 SUIDSet User ID—— 數字 4當對一個可執行文件設置 SUID 位后任何用戶執行該程序時都會以文件擁有者的權限運行而不是執行者自身的權限。最經典的例子是 passwd 命令它允許普通用戶修改自己的密碼需要寫入 /etc/shadow該文件只有 root 可寫。$ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 68208 ... /usr/bin/passwd看到用戶權限位的 s 了嗎它取代了原來的 x表示 SUID 已設置且擁有者有執行權限。設置 SUIDchmod us myprogram # 符號法 chmod 4755 myprogram # 數字法首位 4 表示 SUID安全風險SUID 讓普通程序具有高權限若程序有漏洞可能被提權攻擊因此要謹慎使用。6.2 SGIDSet Group ID—— 數字 2SGID 對文件和目錄的行為不同作用于可執行文件執行時以文件所屬組的權限運行類似 SUID 的組版本。作用于目錄更常用在該目錄下創建的新文件其所屬組會自動繼承父目錄的組而不是創建者自己的主組。這對于多人共享協作目錄非常有用。設置 SGID 目錄chgrp developers shared/ chmod gs shared/ # 或 chmod 2775 shared/ ls -ld shared/ drwxrwsr-x 2 alice developers 4096 ... shared/注意權限位中的 s 出現在組權限的位置。6.3 Sticky Bit粘滯位—— 數字 1粘滯位Sticky Bit僅對目錄有意義。設置了粘滯位的目錄任何用戶都可以在該目錄下創建文件但只能刪除自己擁有的文件不能刪除別人的文件即使目錄本身是 777 權限。最經典的例子是 /tmp 目錄$ ls -ld /tmp drwxrwxrwt 20 root root 4096 ... /tmp其他人權限位的 t 表示粘滯位已設置且執行權限存在。設置粘滯位chmod ot shared_dir # 符號法 chmod 1777 shared_dir # 數字法首位 1 表示 Sticky常見應用場景多用戶共享的臨時目錄、文件上傳目錄。它既能保證所有用戶都能寫又能防止惡意或誤刪他人的文件。7. 常見誤區與注意事項對目錄的執行權限理解不清想訪問目錄內文件必須要有目錄的x權限。只有r權限就只能ls列出文件名但不能cd進去也不能訪問文件內容。數字模式首位經常忘chmod 777只設置基本權限。要同時加 SUID、SGID 或 Sticky 必須寫四位數如1777、2775、4755。忘了首位會清零特殊權限。SUID 的安全陷阱不要給不可信的二進制文件設置 SUID尤其是 root 的 SUID 程序可能成為系統漏洞的入口。目錄的 w 權限不等于可刪除刪除文件需要目錄的寫權限與文件本身的寫權限無關。即使文件是只讀的只要用戶有目錄的寫權限就可以刪除它。權限修改需要文件所有權或 root普通用戶不能隨意chmod別人的文件也不能把文件的所有者chown給別人除非是 root。8. 小結Linux 權限模型基于用戶、組、其他人三種身份配以讀、寫、執行三種權限。使用ls -l查看權限用chmod符號或數字修改。用chown、chgrp改變所有者和組。umask控制新建文件的默認權限。特殊權限SUID (4)執行時以文件所有者權限運行。SGID (2)文件以所屬組運行目錄中新建文件繼承目錄的組。Sticky (1)目錄中只有文件所有者能刪除自己的文件。