Linux 文件权限是每个开发者迟早会被绊倒的地方。脚本加完权限还是跑不起来,Web 服务器读不到静态文件,SSH 私钥权限太宽导致登录被拒——这些问题的根源都是没搞清 chmod 的逻辑。本文从原理到实战,把常用权限值讲清楚。

Unix 权限模型

Linux 的每个文件和目录都有三组权限:

  • Owner(所有者) — 文件的创建者或指定用户
  • Group(组) — 文件所属用户组的成员
  • Others(其他人) — 所有其他用户

每组权限包含三种类型:

符号名称对文件对目录
r读取查看文件内容列出目录内容(ls
w写入修改文件内容在目录内创建、重命名、删除文件
x执行作为程序运行进入目录(cd)并访问其中的文件
ls -la
# -rwxr-xr-- 1 alice dev 4096 Apr 5 10:00 deploy.sh
#  ^^^ ^^^ ^^^
#  |   |   其他人: r-- (4)
#  |   组: r-x (5)
#  所有者: rwx (7)

八进制记法

每一组权限用二进制权重映射为一个数字:

r = 4  (二进制 100)
w = 2  (二进制 010)
x = 1  (二进制 001)

将三组数字相加,得到对应的八进制权限值:

八进制二进制权限
7111rwx
6110rw-
5101r-x
4100r—
0000---

三位八进制数(如 755)依次表示 所有者 / 组 / 其他人 的权限。

常用 chmod 值详解

chmod 755

所有者: rwx (7)  — 读、写、执行
组:     r-x (5)  — 读、执行
其他人: r-x (5)  — 读、执行

适用场景: 可执行脚本、程序二进制文件、Web 目录。所有人可以进入目录或运行脚本,但只有所有者能修改内容。

chmod 755 /var/www/html
chmod 755 deploy.sh

chmod 644

所有者: rw- (6)  — 读、写
组:     r-- (4)  — 只读
其他人: r-- (4)  — 只读

适用场景: 普通文本文件、HTML 页面、图片、配置文件。所有者可编辑,其他人只能读取。

chmod 644 index.html
chmod 644 /etc/nginx/nginx.conf

chmod 600

所有者: rw- (6)  — 读、写
组:     --- (0)  — 无权限
其他人: --- (0)  — 无权限

适用场景: 只有所有者可以访问的私密文件——SSH 私钥(~/.ssh/id_rsa)、.env 环境变量文件、包含密码的配置。SSH 客户端会拒绝使用权限不是 600 的私钥。

chmod 600 ~/.ssh/id_rsa
chmod 600 .env

chmod 777

所有者: rwx (7)
组:     rwx (7)
其他人: rwx (7)

危险。 系统上所有人都可以读、写、执行。不要在生产环境使用 777,尤其是 Web 目录内的路径——任何进程都可以向其中写入任意文件。

唯一合理用途:本地开发时快速排查是否是权限导致的问题,定位完毕后立刻恢复。

chmod 775

组成员也获得写权限。适用于多人协作的项目目录,团队成员同属一个用户组:

chown -R :developers /var/www/project
chmod -R 775 /var/www/project

符号记法

八进制记法精确,但需要心算。符号记法更适合增量修改:

# 给所有者加执行权限
chmod u+x script.sh

# 去掉组和其他人的写权限
chmod go-w sensitive.cfg

# 精确设置:rw-r--r--
chmod u=rw,go=r file.txt

# 给所有人加执行权限
chmod a+x script.sh

符号说明:u = 所有者,g = 组,o = 其他人,a = 所有人 操作符:+ = 添加,- = 去除,= = 精确设置

递归修改权限

对目录及其所有内容批量修改:

chmod -R 755 /var/www/html

注意: -R 会对文件和目录应用同一个权限值。目录需要 x 才能被进入,普通文件通常不需要执行权限。用 find 分别处理更稳妥:

# 目录: 755
find /var/www/html -type d -exec chmod 755 {} \;

# 文件: 644
find /var/www/html -type f -exec chmod 644 {} \;

特殊权限位

除了标准的九位权限,还有三个特殊标志位:

Setuid(4xxx): 可执行文件设置后,运行时以文件所有者身份执行,而非调用者。sudopasswd 等系统命令使用此机制。

Setgid(2xxx): 目录设置后,目录内新建文件自动继承该目录的用户组,而非创建者的主组。适合多人协作目录。

Sticky bit(1xxx): 目录设置后,用户只能删除自己创建的文件。/tmp 目录就设置了 sticky bit。

ls -la /
# drwxrwxrwt  ... tmp   (末尾的 't' 表示 sticky bit)

ls -la /usr/bin/passwd
# -rwsr-xr-x  ... passwd  (所有者执行位的 's' 表示 setuid)

权限速查表

八进制符号记法常见用途
400r--------只读保护
600rw-------私密文件、SSH 私钥、.env
644rw-r—r—Web 文件、配置、普通文本文件
700rwx------个人脚本、私有目录
755rwxr-xr-x脚本、程序、公开目录
775rwxrwxr-x团队协作项目目录
777rwxrwxrwx生产环境禁用

免心算,直接用工具

如果不想每次都手动换算八进制,直接用计算器。试用 ZeroTool chmod 计算器 →

勾选所有者、组、其他人的读/写/执行权限,八进制值实时更新。也可以反向输入八进制值,直接看它代表哪些权限——非常适合看别人的部署脚本时快速确认。

小结

日常工作中 90% 的情况只需要两个值:644 用于文件,755 用于目录和可执行文件。需要私密保护的文件用 600777 只在本地调试时临时用,生产环境绝对不要出现。

不确定某个八进制值的含义?用 chmod 计算器查一下,比猜更靠谱。