chmod(change mode)是 Linux 下用来修改文件或目录权限的基本命令。权限决定了谁能读取、写入或执行某个文件。在深入命令之前,先理解权限的三个层面和三种类型:
- 三个层面:文件所有者(user,简称 u)、所属组(group,简称 g)、其他人(others,简称 o)。
- 三种类型:读(read,r)、写(write,w)、执行(execute,x)。
用 ls -l 可以看到类似 -rw-r--r-- 的字符串,第一个字符表示文件类型(- 普通文件,d 目录),后面每三个字符为一组,依次对应所有者、组、其他人的权限。
chmod 支持两种设置方式:符号模式 和 数字模式,掌握它们就能灵活应对所有权限管理场景。
符号模式:直观地增减权限
符号模式下,你通过“谁 + 操作 + 什么权限”的语法来修改权限。
谁(who):
u:所有者g:所属组o:其他人a:所有人(相当于 ugo)
操作(operator):
+:增加权限-:移除权限=:精确设置为指定权限(会抹掉该对象的原有权限)
权限(permission):
r:读w:写x:执行
常用示例:
chmod u+x script.sh # 给文件所有者加上执行权限
chmod go-w report.txt # 移除组和其他人的写权限
chmod a=r data.txt # 所有人都只剩读权限(所有者原来若有写和执行也会被去掉)
chmod u=rwx,g=rx,o= myapp # 所有者读写执行,组读执行,其他人无任何权限
符号模式的优势是意图清晰,尤其当你只需对某类对象做少量增减时非常方便。
数字模式:一次性精确设定
数字模式(也称八进制模式)用一个三位或四位的八进制数来代表全部权限。每个权限对应一个数值:
- 读(r)= 4
- 写(w)= 2
- 执行(x)= 1
将每类对象的权限数值相加,得到一个 0~7 的数字。三位数字依次代表所有者、组、其他人的权限。
常见组合:
7= 4+2+1 = rwx6= 4+2 = rw-5= 4+1 = r-x4= 4 = r--0= 无任何权限
示例:
chmod 755 script.sh # 所有者 rwx(7),组 r-x(5),其他人 r-x(5)
chmod 644 document.txt # 所有者 rw-(6),组 r--(4),其他人 r--(4)
chmod 600 id_rsa # 只有所有者可读写(6),其他人都无权限(0)——非常适合私钥文件
chmod 777 public_dir # 所有人都有完整权限(777),通常不推荐,存在安全风险
数字模式特别适合在脚本或配置说明中使用,因为它一次性把权限设到精确状态,无需考虑原有权限是什么。
针对目录的特别说明
目录的执行权限(x)含义与文件不同:它表示能否进入该目录(cd)。如果目录没有 x 权限,即使有读权限也无法访问其中的文件。因此常见的目录权限是 755(所有者可完全管理,其他人可进入浏览)或 700(仅所有者可进入)。
特殊权限(可选了解)
有时你会在数字前面看到一个额外的数字,例如 chmod 4755 或 chmod 2775,那是用来设置 setuid、setgid 和粘滞位(sticky bit)的。它们有专门用途:
- setuid(4):文件执行时拥有文件所有者的权限,典型如
/usr/bin/passwd。 - setgid(2):文件执行时拥有文件所属组的权限;对目录设置后,目录内新建文件会自动继承该目录的组。
- sticky(1):多用于共享目录如
/tmp,防止用户删除其他用户的文件。
在日常使用中,掌握基本的 755、644、600 等组合足以应对 90% 以上的场景,剩余特殊权限在需要时再查文档即可。
实用建议:对于普通数据文件,用 644 或 640;对于可执行程序或脚本,用 755;对于敏感配置文件(如 SSH 私钥),用 600。养成用数字模式快速校准权限的习惯,会让服务器管理更加安全高效。