文章目錄
- 1. 命令格式
- 2. 基本用法
- 2.1 符號模式
- 2.2 八進制數字模式
- 3. 高級用法
- 3.1 遞歸操作
- 3.2 參考權限
- 3.3 特殊權限位(Setuid, Setgid, Sticky Bit)
- 3.4 X 特殊執行權限
- 4. 注意事項
- 4.1權限與所有權
- 4.2 Root 權限
- 4.3 安全風險
- 4.4 -R 的風險
- 4.5 目錄的執行權限
1. 命令格式
chmod 命令的完整格式如下:
chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...
[OPTION]
: 可選的操作選項MODE
: 權限模式,通常由[ugoa...][[+-=][perms...]...]
部分組成ugoa
: 指定權限作用的對象u
: 文件所有者 (user)g
: 文件所屬組 (group)o
: 其他用戶 (others)a
: 所有用戶 (all),是默認值
+-=
: 指定操作動作+
: 添加權限-
: 移除權限=
: 設置權限為精確值
perms
: 具體的權限r
: 讀 (read)w
: 寫 (write)x
: 執行 (execute)X
: “特殊”的執行權限(后面詳解)s
: 設置用戶ID (setuid) 或 設置組ID (setgid)t
: 粘滯位 (sticky bit)
OCTAL-MODE
: 八進制數字模式- 由 4 位或 3 位數字組成(如 755, 644, 4755)
--reference=RFILE
: 參考另一個文件 RFILE 的權限來設置當前文件FILE
: 要操作的一個或多個目標文件或目錄
2. 基本用法
基本用法主要通過 符號模式 和 八進制數字模式 來修改文件權限。
2.1 符號模式
# 為所有用戶添加執行權限
chmod a+x script.sh
# 或省略 'a',因為默認就是 all
chmod +x script.sh# 移除所屬組和其他用戶的寫權限
chmod go-w document.txt# 為文件所有者設置精確的讀寫執行權限,并清除組和其他用戶的所有權限
chmod u=rwx,go= myfile
# 執行后權限為:-rwx------
2.2 八進制數字模式
這是一種最常用且最精確的方式。三位數字分別代表 所有者(u)、所屬組(g)、其他用戶(o) 的權限。
數字 | 權限 | 含義 |
---|---|---|
4 | r– | 讀 |
2 | -w- | 寫 |
5 | r-x (4+1) | 讀和執行 |
6 | rw- (4+2) | 讀和寫 |
7 | rwx (4+2+1) | 讀寫和執行 |
- 示例:
chmod 755 my_script.sh
# 結果:-rwxr-xr-x
# 所有者:讀、寫、執行 (7)
# 組:讀、執行 (5)
# 其他用戶:讀、執行 (5)chmod 600 secret.txt
# 結果:-rw-------
# 所有者:讀、寫 (6)
# 組:無權限 (0)
# 其他用戶:無權限 (0)
3. 高級用法
3.1 遞歸操作
使用 -R 選項可以遞歸地修改目錄及其內部所有文件和子目錄的權限。
chmod -R 755 /var/www/mywebsite/
# 目錄:rwxr-xr-x
# 文件:rwxr-xr-x (注意:這會讓所有文件都可執行,可能不安全)
3.2 參考權限
不需要記住復雜的八進制數,直接復制另一個文件的權限。
# 讓 file2 的權限和 file1 一模一樣
chmod --reference=file1 file2
3.3 特殊權限位(Setuid, Setgid, Sticky Bit)
這些權限用于特殊功能,請謹慎使用。
- Setuid (s 在用戶執行位): 以文件所有者的身份運行程序,而不是執行者。
八進制表示
:在三位數前加4
(如4755
)案例
:passwd
命令就需要setuid
來修改/etc/shadow
文件:
chmod u+s /usr/bin/passwd
# 或
chmod 4755 /usr/bin/passwd
# 結果:-rwsr-xr-x (其中的 's')
- Setgid (s 在組執行位):
對文件
:以文件所屬組的身份運行程序。對目錄
:在該目錄下創建的任何新文件或子目錄,其所屬組都將繼承此目錄的所屬組,而不是創建者的主要組。這對于團隊協作共享目錄極其重要。八進制表示
:在三位數前加2
(如2770
)案例
:設置一個共享目錄:
chmod g+s /path/to/shared_directory
# 或
chmod 2770 /path/to/shared_directory
# 結果:drwxrws--- (其中的 's')
- Sticky Bit (t 在其他用戶執行位):它保證只有文件的所有者或 root 才能刪除或重命名該目錄下的文件。
八進制表示
:在三位數前加 1 (如 1777)案例
:查看 /tmp 目錄的權限
ls -ld /tmp
# 輸出:drwxrwxrwt ... /tmp (其中的 't')
# 設置一個目錄的粘滯位:
chmod o+t /tmp/mydir
# 或
chmod 1777 /tmp/mydir
3.4 X 特殊執行權限
它是一個智能的 x
。當使用 X
而不是 x
時,權限只會被應用到:
- 目錄(目錄天然需要 x 權限才能進入)
- 那些已經至少擁有一個執行權限的文件(即它本身已經是可執行文件或腳本)
這在遞歸操作中非常有用。
- 案例:遞歸地為目錄添加執行權限,并只為已經是可執行的文件添加執行權限:
chmod -R a+rX myproject/
# 這條命令會:
# 1. 為所有用戶(ugo/a)添加讀(r)權限。
# 2. 為所有目錄添加執行(X)權限(因為目錄是“可執行”的)。
# 3. 只為那些原本就有x權限的文件添加執行(X)權限,不會讓普通文本文件變成可執行文件。
4. 注意事項
4.1權限與所有權
chmod
改變的是權限,而 chown
和 chgrp
改變的是所有者和所屬組。不要混淆。
4.2 Root 權限
修改你不擁有的文件(非 root
用戶創建的文件)的權限通常需要 sudo
4.3 安全風險
- 切勿隨意將文件設置為
777
。這意味著任何用戶都可以修改或執行它,是巨大的安全漏洞 - 謹慎使用
setuid/setgid
權限,特別是放在root
擁有的文件上時,這可能成為提權漏洞。
4.4 -R 的風險
遞歸修改權限是一把雙刃劍。一個錯誤的遞歸命令(如 chmod -R 777 /
)會徹底破壞你的系統。在執行遞歸操作前,務必雙重檢查路徑。
4.5 目錄的執行權限
目錄的 x
(執行)權限意味著 “可進入” 。沒有 x
權限,即使有 r
(讀)權限,也無法用 ls
列出其內容。