13 10 月 2026

"Permission denied" 是 Linux 新手遇到最多的报错。网上的答案通常是"加个 sudo"或者"chmod 777",前者掩盖问题,后者制造更大的问题。

这篇把 Linux 权限体系讲透:权限位怎么读、数字怎么算、chmod/chown 怎么用、 Umask 是什么、特殊权限位有哪些,以及不同场景该设什么权限。

练手推荐 财富云计算 的云服务器,NAT 型云服务器没有独立公网 IP,价格比带独立 IP 的机型省一半以上,跑内网服务、游戏服务端、练手环境都很合适。

一、看懂权限位

执行 ls -l:

$ ls -l
-rw-r--r-- 1 root root   1234 Oct 12 10:00 config.yml
drwxr-xr-x 2 root root   4096 Oct 12 10:00 data
-rwxr-xr-x 1 root root  15680 Oct 12 10:00 start.sh
lrwxrwxrwx 1 root root     11 Oct 12 10:00 link -> /data/real

拆开第一列 -rwxr-xr-x:

-   rwx   r-x   r-x
│    │     │     │
│    │     │     └── 其他人(others)的权限
│    │     └──────── 所属组(group)的权限
│    └────────────── 所有者(user)的权限
└─────────────────── 文件类型

文件类型(第一位):

符号含义
-普通文件
d目录
l软链接(快捷方式)
b / c块设备 / 字符设备
ssocket 文件
p管道文件

权限字符(后九位,每三位一组):

符号对文件对目录
r (read)能读内容能列出目录里有什么
w (write)能改内容能新建/删除/重命名里面的文件
x (execute)能当程序执行能进入这个目录(cd 进去)
-无此权限无此权限

注意 目录的 x 很关键:目录没有 x 权限,即使有 r 也 cd 不进去、访问不了里面的文件。


二、数字表示法:755、644 是怎么算出来的

每位权限对应一个数字:

r = 4
w = 2
x = 1
- = 0

一组权限就是把数字加起来:

权限计算值
---0+0+00
--x0+0+11
-w-0+2+02
-wx0+2+13
r--4+0+04
r-x4+0+15
rw-4+2+06
rwx4+2+17

三个数字拼起来就是 所有者-所属组-其他人:

  • 755 = rwxr-xr-x — 所有者全权限,其他人可读可执行
  • 644 = rw-r--r-- — 所有者读写,其他人只读(普通文件的标准权限)
  • 600 = rw------- — 仅所有者可读写(私钥、配置文件中的密码类)
  • 700 = rwx------ — 仅所有者(~/.ssh 必须是这个)
  • 777 = rwxrwxrwx — 所有人可读写执行(不要用)
  • 750 = rwxr-x--- — 所有者全权限,组内可读可执行
  • 775 = rwxrwxr-x — 组内可写,常用于共享目录

速算口诀:常用就那几个——755(目录/可执行)、644(普通文件)、600(私密文件)、700(私密目录)。


三、chmod:改权限

数字方式(推荐)

chmod 755 start.sh
chmod 644 index.html
chmod -R 755 /var/www/html     # -R 递归

符号方式(微调更方便)

chmod +x start.sh              # 给所有人加执行
chmod u+x start.sh             # 只给所有者(u=user)加执行
chmod g+w data/                # 给所属组(g=group)加写
chmod o-r secret.txt           # 去掉其他人(o=others)的读
chmod a+r readme.md            # 所有人(a=all)加读
chmod u=rwx,g=rx,o= file.conf  # 精确设定

对象:u 所有者、g 组、o 其他人、a 全部(默认)。
动作:+ 加、- 减、= 精确设为。

参照方式

chmod --reference=good.conf new.conf    # 照抄另一个文件的权限

四、chown / chgrp:改所有者和所属组

chown nginx index.html              # 改所有者
chown nginx:nginx index.html        # 同时改所有者和组
chown :www-data /var/www            # 只改组
chown -R steam:steam /opt/steam     # 递归(游戏服务端常用)
chgrp www-data /var/www             # 只改组(等价于 chown :www-data)

什么时候必须改 owner:

  • Web 目录:chown -R www-data:www-data /var/www/html(Ubuntu 的 nginx/php-fpm 用户是 www-data,CentOS 是 nginx 或 apache)
  • 游戏服务端:一般用专门的低权限用户跑,如 useradd -m steam 然后 chown -R steam:steam /opt/steam
  • 上传目录需要 Web 程序可写,但不要给 777,给组权限即可:
chown -R www-data:www-data /var/www/html/uploads
chmod -R 775 /var/www/html/uploads

五、umask:新建文件的默认权限

新文件默认权限 = 最大权限 - umask。

umask            # 查看当前值,常见 0022
umask 0027       # 临时修改
  • root 默认 umask 022:目录 777-022=755,文件 666-022=644
  • 有些系统普通用户 umask 002:目录 775,文件 664(同组可写,方便协作)

持久修改写入 ~/.bashrc 或 /etc/profile:

echo "umask 027" >> ~/.bashrc

027 意味着新建文件 640、目录 750,其他人完全无权,更安全。


六、三个特殊权限位(进阶)

1. SUID(4)—— 以文件所有者的身份执行

ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ...   注意 owner 位的 x 变成了 s

普通用户改自己密码要写 /etc/shadow,就得靠 passwd 的 SUID 临时获得 root 身份。

chmod u+s file      # 加 SUID
chmod 4755 file     # 数字方式(4 在最前面)
⚠️ 给任意脚本加 SUID 是严重安全风险。排查入侵时常用 find / -perm -4000 找可疑 SUID 文件。

2. SGID(2)—— 对目录:新建文件自动继承目录的组

chmod g+s /data/shared
chmod 2775 /data/shared     # 数字方式

团队协作目录神器:设了 SGID 后,谁在里面建文件,组都自动是目录的组,配合 775 就能互相改。

3. Sticky Bit(1)—— 只有文件所有者能删自己的文件

ls -ld /tmp
# drwxrwxrwt ...   注意 others 位的 x 变成了 t
chmod 1777 /tmp
chmod +t /data/share

/tmp 就是这个机制:所有人可写,但你不能删别人的文件。共享上传目录建议加上。

四位数字汇总:chmod 4755、chmod 2775、chmod 1777。


七、ACL:更精细的授权

当"所有者/组/其他人"三段不够用时(比如只给某个用户访问某个目录),用 ACL:

setfacl -m u:alice:rwx /data/project      # 单独给 alice 授权
setfacl -m g:devs:rx /data/project        # 给组授权
getfacl /data/project                     # 查看
setfacl -x u:alice /data/project          # 删除单条
setfacl -b /data/project                  # 清空所有 ACL

需要文件系统挂载时带 acl 选项(现代系统默认支持)。


八、不同场景该设什么权限(速查)

场景建议权限所有者
网站根目录755 目录 / 644 文件www-data:www-data
网站上传目录775 + SGIDwww-data:www-data
SSH 私钥600本人
~/.ssh 目录700本人
authorized_keys600本人
数据库配置文件(含密码)600运行服务的用户
可执行脚本755 或 700运行用户
日志目录755,日志文件 644服务用户
游戏服务端目录755/644,启动脚本 755专门的低权限用户
备份目录700root

核心原则:够用就行,能不给写权限就不给。


九、为什么千万不要 chmod 777

  1. 任何本地用户都能改你的文件:服务器上有多个用户、或者 Web 程序被入侵,777 意味着攻击者可以往任意目录写马。
  2. Web 程序 777 = 直接被挂马:上传目录 777 且没限制执行,上传个 .php 就拿到 webshell。
  3. 破坏程序自身校验:有些程序(SSH、sudo、MySQL 配置)检测到权限过松会直接拒绝工作,比如 authorized_keys 是 777 会导致密钥登录失效。
  4. 掩盖真正的问题:报 Permission denied 时,正确做法是查清楚"谁在访问这个文件",而不是一把梭开 777。

正确排查姿势:

ls -l 文件                # 看权限和所有者
ps aux | grep 进程名       # 看进程是以谁的身份跑的
id 用户名                  # 看这个用户属于哪些组

多半是"进程用户"和"文件所有者"对不上,用 chown 解决,而不是开 777。


十、常见报错与解决

报错原因解决
Permission denied当前用户对该文件无所需权限sudo 或调整 chmod/chown
Permission denied (publickey)密钥文件权限太松chmod 600 私钥、chmod 700 ~/.ssh
bash: ./x.sh: Permission denied脚本没执行权限chmod +x x.sh
Operation not permitted文件被锁(chattr +i)lsattr 文件,chattr -i 文件
Read-only file system分区只读挂载(磁盘错误保护)mount -o remount,rw / 或 fsck
改了权限仍不生效上层目录没有 x 权限检查整条路径的目录权限
ACL 设置报错文件系统不支持检查挂载选项

chattr 相关(防止文件被误删/篡改):

chattr +i important.conf     # 锁定,连 root 都删不掉
chattr -i important.conf     # 解锁
lsattr important.conf        # 查看

十一、排查权限问题的标准流程

# 1. 看目标文件的权限和归属
ls -l /path/to/file

# 2. 看访问者是谁(以服务为例)
ps aux | grep nginx
# 或
systemctl show -p User nginx

# 3. 看这个用户属于哪些组
id www-data

# 4. 检查整条路径
namei -l /var/www/html/uploads/a.jpg

# 5. 看内核拒绝原因(审计日志)
tail -f /var/log/auth.log
# SELinux 系统另查:
ausearch -m avc -ts recent

CentOS/Rocky 上如果权限看着全对还是被拒,八成是 SELinux,用 setenforce 0 临时关闭验证一下(生产环境请写正确的 SELinux 策略而不是直接关)。


十二、写在最后

权限体系的三个要点:

  1. 最小权限原则 —— 能 644 就别 755,能 755 就别 777。
  2. 用对所有者 —— 服务以谁跑,文件就归谁(chown),比开权限更正确。
  3. 目录的 x 容易忘 —— 进不去目录,多半是中间某层没有 x。

把这些弄明白,Permission denied 基本就能自己解决了。

需要一台服务器实操这些命令?财富云计算 的云服务器支持随时重装系统,练坏了重建即可。NAT 型云服务器无独立公网 IP,价格比带独立 IP 机型省一半以上,做内网服务、游戏服务端、学习环境性价比极高。

相关阅读:

  • 《Linux 用户与 sudo 权限管理详解》
  • 《SSH 密钥登录与账号安全配置》
  • 《Linux 常用命令速查表》
延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:SSH 密钥登录与账号安全配置:从密码登录到服务器不被暴力破解
  2. 下一篇:服务器资源排查实战:CPU 爆了、内存满了、磁盘红了怎么办
发表评论 1