人人都能学编程
English 开始学习
核心 · Linux第 4 课 / 共 6 课免费阅读

权限与 sudo · Linux 与命令行

每个文件,谁能读、谁能改、谁能运行?

课程目录

为什么需要它

权限是 Linux 的第一道防线。所有人都能读的密码文件、谁都能改却又被服务器执行的脚本,都是攻击者的经典入口。「Permission denied(权限不够)」也是新手最常见的错误,而它背后的原因总是很清楚。

直觉理解

ls -l 会显示类似 -rwxr-x--- 的东西。第一个字符(- 是文件,d 是文件夹)后面是三组,每组三个字符:

所有者同组其他人
rwxr-x---

r 读,w 写,x 执行(对文件夹来说:能进入)。

每组也可以写成一个数字:r = 4、w = 2、x = 1,加起来。所以 rwx r-x --- 就是 750,chmod 750 文件 就能这样设置。chmod u+x 文件 只给所有者加上执行权限。

sudo 以 root(管理员)身份运行一条命令,root 什么都能做。

定义

权限位

Read, write and execute for the owner, the group and everyone else, written as letters (rwxr-xr--) or digits (754).
分别给所有者、同组用户和其他人的读、写、执行权限,可以写成字母(rwxr-xr--)或数字(754)。

最小权限

Give each user and program only the access it needs. Secrets are often 600: the owner reads and writes, nobody else can even read.
每个用户和程序只给它需要的权限。密钥文件常用 600:所有者能读写,其他人连读都不行。

示例

deploy.sh 现在还不能运行;secret.env 属于 root,只有 root 能读。

ls -l
chmod u+x deploy.sh
ls -l deploy.sh
./deploy.sh
逐步执行
  1. L1deploy.sh 是 rw-r--r--(644):哪里都没有 x。
  2. L2u+x:给所有者(你)加上执行权限。
  3. L3现在是 rwxr--r--,也就是 744。
  4. L4./ 的意思是:运行当前文件夹里的这个文件。deploying

权限不够,以及 sudo

在互动课里运行

你不是 root,所以 600 的文件对你关着。sudo 能打开它,这正是 sudo 要少用的原因。

whoami
sudo cat secret.env
cat secret.env

这个例子故意以报错结束:重点是学会读报错信息。

逐步执行
  1. L1你是 learner。learner
  2. L2以 root 身份,读成功了。
  3. L3以 learner 身份:权限不够,运行在这里停下。

常见错误

chmod 777

777 让任何人都能读、改、运行这个文件。它「解决」权限错误的方式是去掉所有保护。应该先弄清楚到底谁需要访问。

习惯性加 sudo

带 sudo 的手误可能弄坏整个系统,用 sudo 建的文件也会属于 root。只在确实需要的那一条命令上用。

小测验

1. `rw-r-----` 对应哪三个数字?

  1. A640
  2. B644
  3. C750
查看答案

答案:A

所有者 rw- = 4 + 2 = 6,同组 r-- = 4,其他人 --- = 0。

2. 这段代码会输出什么?

touch key.pem
chmod 600 key.pem
ls -l key.pem
  1. A
    -rw------- 1 learner learner     0 Nov  3 09:00 key.pem
  2. B
    -rw-r--r-- 1 learner learner     0 Nov  3 09:00 key.pem
  3. C
    -rwx------ 1 learner learner     0 Nov  3 09:00 key.pem
查看答案

答案:A

6 = 所有者 rw,其他两组都是 0。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出数字变字母

    执行完这些命令后,ls -l 显示 a 和 b 的权限是什么?

  2. 改需求把密钥锁好

    chmod 777 让所有人都能读写这个密钥。改成只有你能读写 api.key,谁也不能运行它。

  3. 从零写让脚本能运行

    让 deploy.sh 对所有者可执行、对所有人可读、只有所有者可写(也就是 744),然后运行它。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
Permission权限Whether a user may read, write or execute a file.
rootroot 超级用户The administrator account on Linux; it may do anything.
sudosudoRuns one command as root.