chmod · 权限钥匙

上游:lsls -la 查看当前权限)· sudo(改别人的文件需要管理员权限) 下游:chown(改文件主人)· systemctl(服务脚本需要正确权限) 参见:unzip(解压出的文件可能需要设权限)


一句话是什么

chmod 控制谁能对文件做什么——读、写、还是运行, 就像给每扇门设置不同的钥匙权限。


为什么需要它

Linux 里每个文件都有三把锁,三种人各持一把钥匙:

文件的三种人:
  u = user   (文件主人,通常是你自己)
  g = group  (你所在的用户组)
  o = others (其他所有人)

三种权限:
  r = read    (读,可以看内容)
  w = write   (写,可以修改)
  x = execute (执行,可以运行)

你用 ls -la 看文件,最左边那串字符就是权限:

$ ls -la ~/mc-server/bedrock_server
-rwxr-xr-- 1 aaron aaron 120M Apr 20 08:00 bedrock_server
 ↑↑↑↑↑↑↑↑↑
 │└┬┘└┬┘└┬┘
 u   g   o

 └─ - = 普通文件(d = 目录,l = 链接)

位置字符意思
rwxuser主人可以读、写、执行
r-xgroup同组用户可以读和执行,不能写
r--others其他人只能读

核心用法

公式(符号法,推荐)

chmod [谁][加/减][什么] 文件
含义
uuser(文件主人)
ggroup(组)
oothers(其他人)
aall(所有人)
操作含义
+增加权限
-删除权限
=设置为(覆盖)

常用命令表

操作命令结果
给文件加可执行权限chmod +x 文件所有人都能运行
只有主人能读写chmod 600 文件rw-------
所有人都能读执行chmod 755 文件rwxr-xr-x
只有主人能动chmod 700 目录rwx------
公开只读chmod 644 文件rw-r--r--

数字法(快速参考)

4 = r(读)
2 = w(写)
1 = x(执行)

把三种权限相加:
rwx = 4+2+1 = 7
rw- = 4+2+0 = 6
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4

chmod 755 = rwx r-x r-x
           主人 组  其他

Linux 笑话

Aaron 第一次运行 shell 脚本,结果是:

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

他以为 sudo ./start.sh 能解决—— 于是写了一个完全错误的权限方案。

后来他才知道,问题根本不是 sudo,是文件没有 x(执行)权限

ls -la start.sh
# -rw-r--r-- 1 aaron aaron  start.sh
#  ↑↑
#  没有 x!
 
chmod +x start.sh
./start.sh
# 成功运行

教训:Permission denied 不一定要 sudo, 先用 ls -la 检查权限,再决定是加权限还是加 sudo。


参数拟人化拆解 · 数字法 vs 符号法到底怎么选

chmod 的两套写法不是”新手用一个,老手用另一个”——它们各有最适合的场景。

符号法(u/g/o/a + +/-/= + r/w/x)· 适合”微调”

chmod u+x start.sh        # 只给主人加执行权限
chmod g-w report.txt      # 撤销组的写权限
chmod o= secret.txt       # 把"其他人"的所有权限清零
chmod a+r README.md       # 所有人都能读

拟人化:“对某把锁的某种钥匙,单独操作”——动一处,不碰其他。

适用场景:

  • 解决”./xxx.sh 跑不起来”——chmod +x xxx.sh 一招制敌
  • 撤销单项权限:chmod o-r private.log(其他人不能再读,但主人和组的权限不变)

数字法(三位数字)· 适合”整体重置”

4 = r    2 = w    1 = x

每位数字 = 那一类人的权限总和
百位 = u(主人)   十位 = g(组)   个位 = o(其他人)
chmod 644 报告.txt
# 6 = 4+2 = rw-     主人能读写
# 4 = 4   = r--     组只能读
# 4 = 4   = r--     其他人只能读
# → -rw-r--r--

拟人化:“一次性把三套钥匙全部换掉”——所有权限位重写,老的清空。

适用场景:

  • 给新文件设标准权限
  • 跟”标准值”对齐:644 普通文件 / 755 程序和目录 / 600 私密 / 700 私密目录

五个最常用数字 · 背下来省一辈子

数字权限用在哪里
644rw-r--r--普通文件(文档、配置)
755rwxr-xr-x可执行程序、共享目录
600rw-------私密文件(SSH 密钥、密码本)
700rwx------私密目录(如 ~/.ssh/
777rwxrwxrwx危险:所有人都能读写执行,几乎不该用

关键区别 · 加权限 vs 重置权限

# 起始:-rw-r--r--(644)
 
chmod +x file       # 符号法 → -rwxr-xr-x(变成 755,其他位的 r 全保留)
chmod 700 file      # 数字法 → -rwx------(其他人的 r 被清掉了)

符号法 = 加减微调,原有权限保留 数字法 = 整套覆盖,老权限清零

目录的 x 是个反直觉的点

文件的 x = 可执行(程序能跑) 目录的 x = “可进入”(能 cd 进去)

chmod 644 ~/文件夹/    # 移除目录的 x
cd ~/文件夹/
# Permission denied
# 即使你是主人,没有 x 也进不去自己的目录

所以目录通常需要 755700,不能用 644—— 644 对文件没问题,对目录就把自己锁外面了。

-R 递归 · 危险但有用

chmod -R 755 ~/mc-server/
# 把整个目录树(mc-server 及其下所有文件和子目录)都设成 755

问题:递归会给所有文件都加 x,连配置、文档都成了”可执行”。 正经做法是分开处理目录和文件:

# 目录设 755(保留 x 让能进入)
find ~/mc-server -type d -exec chmod 755 {} \;
 
# 文件设 644(普通文件不需要 x)
find ~/mc-server -type f -exec chmod 644 {} \;
 
# 单独给主程序加 x
chmod +x ~/mc-server/bedrock_server ~/mc-server/*.sh

例题精讲

📗 初探 Starter — 给脚本加可执行权限

任务:创建一个脚本,发现跑不了,然后修复它。

# 第一步:写一个简单脚本
echo '#!/bin/bash
echo "Aaron 的第一个脚本!"
echo "当前时间:$(date)"' > ~/练习/hello.sh
 
# 第二步:尝试运行(会失败)
./~/练习/hello.sh
# Permission denied
 
# 第三步:查看当前权限
ls -la ~/练习/hello.sh
# -rw-r--r-- 1 aaron aaron  hello.sh
# 没有 x(执行权限)
 
# 第四步:加上执行权限
chmod +x ~/练习/hello.sh
 
# 第五步:再看权限
ls -la ~/练习/hello.sh
# -rwxr-xr-x 1 aaron aaron  hello.sh
 
# 第六步:运行
~/练习/hello.sh
# Aaron 的第一个脚本!
# 当前时间:Mon Apr 20 08:00:00 CST 2026

你学到了什么.sh 脚本写好之后,一定要 chmod +x 才能运行。


📘 应用 User — 保护私密文件

任务:把一个私密文件设为只有自己能看,其他人完全看不到。

# 创建一个私密文件
echo "这是我的秘密" > ~/私密笔记.txt
 
# 看看默认权限
ls -la ~/私密笔记.txt
# -rw-r--r-- 1 aaron aaron  私密笔记.txt
# 问题:其他人(o)还能读!
 
# 设为只有自己能读写
chmod 600 ~/私密笔记.txt
 
# 验证
ls -la ~/私密笔记.txt
# -rw------- 1 aaron aaron  私密笔记.txt
 
# 测试:切换到 root 看看(root 有特殊权限,能无视权限)
sudo cat ~/私密笔记.txt
# 注意:root 无论什么权限都能读,所以保密对 root 无效
 
# 测试:普通用户能不能读(在多用户系统上)
# 在 Aaron 的机器上只有一个用户,暂时无法测试

你学到了什么600rw-------)是私密文件的标准权限。 注意:root 不受 chmod 限制。


📙 管理 Admin — 给 Minecraft 服务器设置正确权限

任务:解压 BDS 之后,设置正确权限让服务器能运行。

# 解压服务器(假设已完成)
ls -la ~/mc-server/
 
# 检查主程序权限
ls -la ~/mc-server/bedrock_server
# 可能是 -rw-r--r--(没有执行权限)
 
# 给主程序加执行权限
chmod +x ~/mc-server/bedrock_server
 
# 给所有 .sh 脚本加执行权限
chmod +x ~/mc-server/*.sh
 
# 目录权限:确保 aaron 可以进入和修改
chmod 755 ~/mc-server/
 
# 配置文件不需要执行权限,设为 644
chmod 644 ~/mc-server/server.properties
 
# 最终确认
ls -la ~/mc-server/

你学到了什么:不同文件有不同的权限需求—— 可执行程序需要 +x,配置文件只需要 644,目录需要 755


官方文档参考

man chmod        # 完整手册
chmod --help     # 快速选项列表

权限本质是 9 个 bit(3×3),数字法和符号法效果相同,符号法更易读。 在线:https://manpages.ubuntu.com/chmod


节点链接

上游(先理解这些)

  • ls ← ls -la 查看权限
  • sudo ← 改别人的文件需要 sudo chmod
  • unzip ← 解压出来的文件经常要 chmod

同层(权限体系的另一半)

  • chown ← chmod 改权限,chown 改主人;两个一起才完整

下游(正确权限才能做这些)

  • shell-script ← 脚本必须 chmod +x 才能运行
  • systemctl ← 系统服务的脚本需要特定权限

实战


节点版本:v1.0 · 2026-04-20 下一个节点建议:chowntar