"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 | 块设备 / 字符设备 |
s | socket 文件 |
p | 管道文件 |
权限字符(后九位,每三位一组):
| 符号 | 对文件 | 对目录 |
|---|---|---|
r (read) | 能读内容 | 能列出目录里有什么 |
w (write) | 能改内容 | 能新建/删除/重命名里面的文件 |
x (execute) | 能当程序执行 | 能进入这个目录(cd 进去) |
- | 无此权限 | 无此权限 |
注意 目录的 x 很关键:目录没有 x 权限,即使有 r 也 cd 不进去、访问不了里面的文件。
二、数字表示法:755、644 是怎么算出来的
每位权限对应一个数字:
r = 4
w = 2
x = 1
- = 0一组权限就是把数字加起来:
| 权限 | 计算 | 值 |
|---|---|---|
--- | 0+0+0 | 0 |
--x | 0+0+1 | 1 |
-w- | 0+2+0 | 2 |
-wx | 0+2+1 | 3 |
r-- | 4+0+0 | 4 |
r-x | 4+0+1 | 5 |
rw- | 4+2+0 | 6 |
rwx | 4+2+1 | 7 |
三个数字拼起来就是 所有者-所属组-其他人:
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" >> ~/.bashrc027 意味着新建文件 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 + SGID | www-data:www-data |
| SSH 私钥 | 600 | 本人 |
~/.ssh 目录 | 700 | 本人 |
authorized_keys | 600 | 本人 |
| 数据库配置文件(含密码) | 600 | 运行服务的用户 |
| 可执行脚本 | 755 或 700 | 运行用户 |
| 日志目录 | 755,日志文件 644 | 服务用户 |
| 游戏服务端目录 | 755/644,启动脚本 755 | 专门的低权限用户 |
| 备份目录 | 700 | root |
核心原则:够用就行,能不给写权限就不给。
九、为什么千万不要 chmod 777
- 任何本地用户都能改你的文件:服务器上有多个用户、或者 Web 程序被入侵,777 意味着攻击者可以往任意目录写马。
- Web 程序 777 = 直接被挂马:上传目录 777 且没限制执行,上传个
.php就拿到 webshell。 - 破坏程序自身校验:有些程序(SSH、sudo、MySQL 配置)检测到权限过松会直接拒绝工作,比如
authorized_keys是 777 会导致密钥登录失效。 - 掩盖真正的问题:报 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 recentCentOS/Rocky 上如果权限看着全对还是被拒,八成是 SELinux,用 setenforce 0 临时关闭验证一下(生产环境请写正确的 SELinux 策略而不是直接关)。
十二、写在最后
权限体系的三个要点:
- 最小权限原则 —— 能 644 就别 755,能 755 就别 777。
- 用对所有者 —— 服务以谁跑,文件就归谁(chown),比开权限更正确。
- 目录的 x 容易忘 —— 进不去目录,多半是中间某层没有 x。
把这些弄明白,Permission denied 基本就能自己解决了。
需要一台服务器实操这些命令?财富云计算 的云服务器支持随时重装系统,练坏了重建即可。NAT 型云服务器无独立公网 IP,价格比带独立 IP 机型省一半以上,做内网服务、游戏服务端、学习环境性价比极高。
相关阅读:
- 《Linux 用户与 sudo 权限管理详解》
- 《SSH 密钥登录与账号安全配置》
- 《Linux 常用命令速查表》
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复