文章目录
- 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
列出其内容。