为什么你的文件总是「权限不够」?Linux文件权限,3分钟搞懂

你第一次在服务器上看到 `Permission denied` 是什么时候?我猜大概率是装软件时报错、想执行脚本却被拦、或者改个配置文件说没权限。90%的Linux新手都卡在权限这个坎上——因为它既不像代码报错那样有清晰的定位,也不像网络问题那样好排查,它就是一个冷冰冰的”拒绝”。

为什么你的文件总是「权限不够」?Linux文件权限,3分钟搞懂封面

但这篇文章读完,你就能彻底搞懂文件权限——它是Linux安全的基石,也是运维工程师的日常基本功。

一个场景,看懂权限在干什么

你登录服务器,想跑一个自己写的脚本:

$ ./start.sh
-bash: ./start.sh: Permission denied

文件明明就在那里,为什么不让运行?输入 `ls -l start.sh` 看看:

-rw-r--r-- 1 ubuntu ubuntu 120 Jun 18 09:00 start.sh

注意最前面的 `-rw-r–r–`,这10个字符就是权限的核心

| 位置 | 含义 |

|——|——|

| 第1位 `-` | 文件类型(`-`普通文件,`d`目录,`l`链接) |

| 第2-4位 `rw-` | **文件所有者 (Owner)** 的权限 |

| 第5-7位 `r–` | **所属用户组 (Group)** 的权限 |

| 第8-10位 `r–` | **其他人 (Others)** 的权限 |

`r` 是读(read),`w` 是写(write),`x` 是执行(execute)。`start.sh` 的问题是:所有者的权限是 `rw-`,没有 `x`——也就是说文件的主人自己也没法执行它。

三个字母,三类人

把这三个字母记住,你就能读懂任何文件的权限:

`r` (读):能不能 `cat`、`less` 打开看内容;对目录来说,能不能 `ls` 列出里面的文件

`w` (写):能不能编辑修改;对目录来说,能不能在里面创建或删除文件

`x` (执行):能不能直接运行这个文件;对目录来说,能不能 `cd` 进去

权限对应三类人:Owner(文件的主人)、Group(同组成员)、Others(其他人)。Linux用这个三级体系来控制谁能对文件做什么操作。

chmod:改权限就靠它

回到刚才的 `start.sh` 问题——你需要给它加上执行权限。最常用的数字方式:

chmod 755 start.sh

这个 755 是什么意思?每个数字代表一类人的权限,用二进制算的:

| 权限 | 二进制 | 十进制 |

|——|——–|——–|

| `r` (读) | 100 = 4 | 4 |

| `w` (写) | 010 = 2 | 2 |

| `x` (执行) | 001 = 1 | 1 |

`755` 拆开看:Owner=4+2+1=7(全权限),Group=4+0+1=5(读+执行),Others=4+0+1=5(读+执行)。

最常用的三个数字记住就行:

`644`:Owner可读写,别人只能读。适合普通文件、配置文件。

`755`:Owner全权限,别人可读可执行。适合脚本、程序。

`700`:只有Owner有全部权限,别人什么都不能干。适合私密文件、SSH密钥。

还有两种极端情况要小心:

`777`:所有人都有全部权限。这是安全红线——在服务器上给文件 `chmod 777` 等于给所有人留了后门,除非你很清楚自己在干什么,否则永远不要用。

`000`:谁都没有权限。只有root可以改回来,普通用户自己锁了自己也解不开。

另一种写法:符号模式

数字好记,但有时候你只想加一个权限而不改别的,用符号更直观:

chmod u+x start.sh    # Owner(u)加执行
chmod g-w config.ini  # Group(g)去掉写
chmod o-r secret.txt  # Others(o)去掉读
chmod a+x script.sh   # 所有人(a)加执行

`u`=user(Owner), `g`=group, `o`=others, `a`=all。`+`加权限,`-`减权限,`=`精确设置。

三个常见坑,新手必看

坑一:目录没有 x 权限,进不去。 很多人以为目录只要 `r` 就能 `cd`,其实 `cd` 需要 `x`(执行)权限。进去之后能不能 `ls` 列出内容才看 `r`。

坑二:sudo 不是万能的。 `sudo` 让你临时以root身份执行命令,但它不会改变文件本身的权限。如果脚本里有路径引用问题,`sudo ./start.sh` 可能跑起来了但读写文件时又遇到权限问题。

坑三:复制文件权限会变。 `cp` 命令默认会给你复制出来的文件赋予你的默认权限(通常是644),不会保留原文件的权限设置。想保留权限,用 `cp -p` 或 `rsync -a`。

查权限,一句话

掌握这几条命令就够日常用了:

# 看文件详细权限
ls -l 文件名

# 递归看目录下所有文件
ls -la 目录/

# 改权限
chmod 644 普通文件
chmod 755 可执行文件
chmod 700 私密文件

# 验证改了没有
ls -l 文件名

一位运维老鸟说过:Linux权限系统看似简单,但它是服务器安全的第一道防线。花10分钟真正理解r、w、x和数字的含义,比看10篇教程都有价值。

今天学到: 文件权限的三个字母(r/w/x)对应三类人(Owner/Group/Others),`chmod` 用数字 644/755/700 就能覆盖90%的场景。下次遇到 `Permission denied`,先 `ls -l` 看一眼,大概率自己就解决了。


— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn

滚动至顶部
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅