Linux 文件权限到底怎么回事
Linux 文件权限到底怎么回事
不讲复杂的 SELinux,只讲日常最常用的文件权限。
从一次报错开始
$sshuser@server $ ./deploy.sh -bash: ./deploy.sh: Permission denied第一反应是加权限:
chmod777deploy.sh虽然能跑,但 777 意味着任何人都可以改这个文件——这是安全风险。看懂权限之后,你会知道应该用chmod +x或755。
先看懂ls -l的输出
ls-ldeploy.sh-rwxr-xr-x 1 root root 123 Apr 28 10:00 deploy.sh拆成三块来看。
第一块:文件类型和权限(10 个字符)
- rwx r-x r-x │ └┬─ └┬─ └┬─ │ │ │ └── 其他人(other) │ │ └────── 同组用户(group) │ └─────────── 文件所有者(user) └─────────────── 文件类型(- 普通文件,d 目录,l 符号链接)每个三位的含义:
r w x 读 写 执行 4 2 1rwx= 4+2+1 = 7(可读可写可执行)r-x= 4+0+1 = 5(可读可执行,不可写)r--= 4+0+0 = 4(只读)---= 0+0+0 = 0(没有权限)
第二块:所有者和组
root root └┬── └┬── │ └── 所属组 └──────── 文件所有者- 谁是这个文件的主人(owner)
- 这个文件属于哪个组(group)
第三块:大小和修改时间
123 Apr 28 10:00 大小 修改时间三种改权限的命令
chmod— 改权限位
用数字方式(推荐):
chmod755deploy.sh# rwxr-xr-x 所有者可读写执行,其他人只读执行chmod644config.cfg# rw-r--r-- 所有者可读写,其他人只读chmod600id_rsa# rw------- 只有所有者能读写chmod700private/# rwx------ 只有所有者能进入目录chmod777file# 不推荐,任何人可读写执行用字母方式(单次操作可读性更好):
chmod+x deploy.sh# 加执行权限(不影响已有权限)chmod-xdeploy.sh# 去掉执行权限chmodu+w config.cfg# 给所有者(u)加写(w)权限chmodg+r config.cfg# 给组(g)加读(r)权限chmodo-r config.cfg# 去掉其他人(o)的读权限chmoda+x script.sh# 所有人(a)加执行权限递归修改(目录及其内部所有文件):
chmod-R755/path/to/dirchown— 改所有者
chownuser file.txt# 改文件所有者为 userchownuser:group file.txt# 改所有者和组chown:group file.txt# 只改组chown-Ruser:group /data# 递归改目录下所有chgrp— 只改所属组
chgrpdevelopers config.cfg目录权限和文件权限不一样
这是一定要分清的地方:
| 权限 | 对文件的意义 | 对目录的意义 |
|---|---|---|
r(读) | 可以查看文件内容 | 可以列出目录内容(ls) |
w(写) | 可以修改文件内容 | 可以创建/删除目录里的文件 |
x(执行) | 可以执行文件(脚本/程序) | 可以进入目录(cd) |
文件x是执行,目录x是"穿过"(进入)。
典型配置:
chmod755/var/www/html# drwxr-xr-x 可以进入和查看chmod700~/.ssh# drwx------ 只有自己能进入目录一般至少需要r-x(可以ls和cd)才有意义。
实战:问题排查
1. 上传的脚本不能执行
$ ./deploy.sh -bash: ./deploy.sh: Permission denied解决:
ls-ldeploy.sh# 确认没有 x 权限chmod+x deploy.sh# 加执行权限2. Nginx 报 403 Forbidden
没权限读静态文件:
# 看 Nginx 以什么用户运行psaux|grepnginx# 通常是 www-data 或 nginx# 看文件权限和所有者ls-l/var/www/html/# 修复sudochown-Rwww-data:www-data /var/www/html/sudochmod-R755/var/www/html/3. SSH 密钥不生效
$sshuser@server Permissions 0644for'id_rsa'are too open.SSH 对私钥文件权限很敏感——太松就拒绝使用:
chmod600~/.ssh/id_ed25519chmod700~/.sshchmod600~/.ssh/authorized_keys4. 别人创建的文件我删不掉
$rm/shared/tmp/file.txt rm: cannot remove: Permission denied在目录有写权限才能删里面的文件:
ls-ld/shared/tmp/# 看目录权限sudochmod777/shared/tmp/# 让所有人能删(不推荐)# 或者加 sticky bit(更合理)sudochmod1777/shared/tmp/# 只有文件所有者和 root 能删SUID / SGID / Sticky Bit
这三个特殊权限不那么常用,但看到了要知道是什么意思。
SUID(Set User ID)
ls-l/usr/bin/passwd-rwsr-xr-x 1 root root ... /usr/bin/passwd所有者位的x变成了s。普通用户执行passwd时会临时有 root 权限(因为文件所有者是 root),这样才能改/etc/shadow。
数字是 4:chmod 4755 file
SGID(Set Group ID)
ls-l/shared/dirdrwxr-sr-x 2 user developers ...组位的x变成了s。在这个目录里新建的文件,所属组自动继承目录的组。
数字是 2:chmod 2755 dir
Sticky Bit
ls-ld/tmpdrwxrwxrwt 10 root root ...其他人位的x变成了t。在 /tmp 里,任何人都能创建文件,但只能删自己的文件。
数字是 1:chmod 1777 /tmp
最常用的权限组合
| 权限 | 数字 | 应用场景 |
|---|---|---|
rwx------ | 700 | 私钥目录~/.ssh |
rw------- | 600 | 私钥文件、密码配置文件 |
rwxr-xr-x | 755 | 可执行脚本、目录通用权限 |
rw-r--r-- | 644 | 配置文件、代码文件 |
rwxr-xr-x+ setgid | 2755 | 团队共享目录 |
rwxrwxrwt | 1777 | /tmp 类共享临时目录 |
日常 90% 的情况只用到 755 和 644。
chmod755script.sh# 脚本可以执行chmod644config.yaml# 配置文件只读chmod600.secret# 敏感文件只有自己能看到一行命令快速定位权限问题
# 找当前目录下权限有问题(太松的)的文件find.-perm/o+w-ls# 找没有执行权限的 .sh 文件find.-name"*.sh"!-executable-ls# 看所有者和组find.!-usermyuser-o!-groupmygroup-ls总结
| 你想干什么 | 用什么命令 |
|---|---|
| 让文件能执行 | chmod +x file |
| 让文件只有自己能读 | chmod 600 file |
| 把文件给另一个用户 | chown user file |
| 让目录可进入可查看 | chmod 755 dir |
| 删不掉提示 Permission denied | 看目录权限,不是看文件权限 |
关于 777——尽量别用。权限的本质是最小够用原则:需要读就给读,需要执行就给执行,不需要就不给。
