一、引言:为什么服务器上的文件我不能改?
还记得第7篇我们用Vim编辑文件时的场景吗?有时候保存文件会提示:
text
E45: 'readonly' option is set (add ! to override)
或者更直接:
text
Permission denied
这不是Vim的问题,而是Linux的安全机制在起作用。你在Windows上用惯了管理员账户,可能从未遇到过"权限不足"的情况。但在Linux服务器上,不是所有用户都有权修改所有文件------这是一个多用户系统的设计基石。
想象一下:如果公司的服务器上,实习生也能修改CEO的工资单文件,或者删除系统核心配置文件,那会是什么灾难场景?
Linux的权限体系就是为防止这种情况而设计的。今天我们先解决最核心的问题:你是谁?你能动哪些文件?
二、root用户:系统的"神"
2.1 root是什么?
root是Linux系统中的超级用户 ,它的UID(用户ID)固定为0。拥有root权限意味着没有任何限制------可以读写任何文件、杀死任何进程、修改系统配置、甚至删除整个操作系统。
一个直观的理解:普通用户是租客,只能在自己房间里活动;root是房东,拥有整栋楼所有房间的钥匙,包括配电房和水阀。
2.2 root的双面性:必需的权力,巨大的风险
为什么需要root?
-
安装和卸载系统级软件
-
修改系统配置文件(如网络、防火墙)
-
管理其他用户账户
-
访问受保护的系统日志
为什么不能滥用root?
-
误操作无法挽回 :
rm -rf /这条命令,普通用户执行会因为权限不足而失败;root执行则会让整个系统灰飞烟灭 -
安全风险极高:如果黑客获取了root密码,整个系统就彻底沦陷了
-
难以追溯:多人共用root账户时,谁做了什么操作无从查证
生产环境的铁律:
永远不要以root身份登录做日常工作。 使用普通账户,需要时临时提权。
2.3 如何成为root?
方法一:直接登录root
bash
su - root # 切换到root用户,需要输入root密码
方法二:使用sudo(推荐)
bash
sudo 命令 # 以root权限执行单条命令
两种方式的区别,我们在第四节详细展开。
三、普通用户的创建与管理
既然不能用root日常操作,那就需要创建普通用户。
3.1 useradd:创建用户
useradd是创建新用户的标准命令。基本语法:
bash
sudo useradd [选项] 用户名
最常用的选项组合:
bash
sudo useradd -m -s /bin/bash zhangsan
-
-m:自动创建用户的家目录(/home/zhangsan) -
-s /bin/bash:指定用户的默认Shell为bash
如果不加-m,用户虽然会被创建,但没有自己的家目录------这会导致登录后各种奇怪的问题。
3.2 passwd:设置密码
新创建的用户默认是没有密码的,处于锁定状态,无法登录。
bash
sudo passwd zhangsan
执行后会提示输入两次密码。注意:输入密码时屏幕不会有任何显示(连星号都没有),这是Linux的安全设计,正常输入后回车即可。
3.3 用户信息存储在哪里?
Linux的用户信息分散在几个关键文件中:
| 文件 | 存储内容 | 敏感性 |
|---|---|---|
/etc/passwd |
用户名、UID、家目录、Shell | 所有用户可读 |
/etc/shadow |
加密后的密码哈希 | 只有root可读 |
/etc/group |
组信息 | 所有用户可读 |
可以用以下命令查看新建用户的信息:
bash
grep zhangsan /etc/passwd
id zhangsan # 更直观地查看用户的UID和所属组
3.4 su:切换用户
su(Switch User)用于在终端中切换用户身份:
bash
su - zhangsan # 切换到zhangsan,同时加载该用户的环境变量
su zhangsan # 只切换身份,不加载环境(不推荐)
su -和su的关键区别:
| 对比项 | su zhangsan |
su - zhangsan |
|---|---|---|
| 当前目录 | 保持在原位置 | 切换到用户家目录 |
| 环境变量 | 保留原用户的 | 完整加载新用户的 |
| 推荐程度 | ❌ 不推荐 | ✅ 推荐 |
一个简单的记忆:切换用户时,始终加上短横线。
四、sudo:把root权限"借"给普通用户
4.1 sudo的工作原理
sudo的全称是"SuperUser Do",它允许普通用户临时以root身份执行特定命令,而不需要知道root密码。
执行sudo 命令时:
-
系统检查当前用户是否在sudo授权列表中
-
如果在,提示用户输入自己的密码(不是root密码)
-
验证通过后,以root权限执行命令
-
执行完毕后,权限自动收回
4.2 给用户授予sudo权限
sudo权限通过/etc/sudoers文件控制。千万不要直接编辑这个文件 ,必须使用visudo命令:
bash
sudo visudo
visudo会在保存前检查语法错误,防止配置错误导致所有用户都无法使用sudo。
添加授权的格式:
text
用户名 ALL=(ALL) 命令路径
最常见的配置是允许用户执行所有命令:
text
zhangsan ALL=(ALL) ALL
更安全的做法是只授权特定命令:
text
zhangsan ALL=(ALL) /bin/systemctl restart nginx
4.3 sudo的日常使用
bash
sudo ls /root # 以root权限查看/root目录
sudo systemctl restart nginx # 以root权限重启nginx服务
sudo -l # 查看当前用户有哪些sudo权限
sudo -v # 刷新sudo时间戳(延长免密时间)
4.4 su与sudo的选择策略
| 场景 | 推荐方式 | 理由 |
|---|---|---|
| 执行单条特权命令 | sudo 命令 |
最小权限原则 |
| 需要连续执行多条特权命令 | sudo -i 或 sudo su - |
避免反复输入sudo |
| 切换到其他普通用户 | su - 用户名 |
这是su的本职工作 |
五、rwx权限体系:文件世界的通行证
理解了"你是谁"之后,我们来看"你能动什么"。
5.1 权限的三位一体结构
在Linux中,每个文件和目录都有三组权限,分别对应三类身份:
text
-rwxr-xr-- 1 zhangsan developers 1024 Apr 20 10:30 script.sh
┬ ┬ ┬
│ │ └─── 其他用户权限(其他人能不能动)
│ └───── 所属组权限(同组的人能不能动)
└─────── 所有者权限(文件主人能不能动)
5.2 rwx的含义:文件和目录完全不同
这是初学者最容易混淆的地方。r、w、x对文件和目录的意义截然不同:
对文件而言:
| 权限 | 字母 | 含义 | 能做什么 |
|---|---|---|---|
| 读 | r | 查看文件内容 | cat、less、head |
| 写 | w | 修改文件内容 | vim、echo >> |
| 执行 | x | 作为程序运行 | ./script.sh |
对目录而言:
| 权限 | 字母 | 含义 | 能做什么 |
|---|---|---|---|
| 读 | r | 列出目录内容 | ls |
| 写 | w | 在目录中增删文件 | touch、rm、mv |
| 执行 | x | 进入目录 | cd |
5.3 三个关键认知
认知一:目录的w权限是"核武器"
对目录拥有写权限,意味着你可以删除目录下的任何文件 ,无论这些文件本身属于谁、权限如何。
举例说明:
bash
# /shared 目录权限为 drwxrwxrwx(所有人可写)
# 该目录下有个root所有的文件 secret.txt,权限为 -rw-------(只有root可读写)
# zhangsan 虽然不能读取 secret.txt 的内容,但可以删除它!
rm /shared/secret.txt # 成功!因为zhangsan对/shared有w权限
这就是为什么共享目录的权限要格外小心。
认知二:目录的r和x必须配合使用
bash
# 只有读权限(r--):能ls看到文件名,但无法cd进入
dr--r--r-- 2 root root 4096 Apr 20 10:30 dir_r_only/
# 用户执行 ls dir_r_only/ 可以看到文件名列表
# 用户执行 cd dir_r_only/ 会失败(Permission denied)
# 只有执行权限(--x):能cd进入,但无法ls看到内容
d--x--x--x 2 root root 4096 Apr 20 10:30 dir_x_only/
# 用户执行 cd dir_x_only/ 成功
# 用户执行 ls 会失败(Permission denied)
实用的权限组合:
-
r-x:可以进入并查看目录内容,但不能创建/删除文件(只读访问) -
rwx:完整权限 -
--x:可以进入但不能列出(用于"盲目录",知道确切路径才能访问)
认知三:文件执行需要x权限,但光有x还不够
一个文件要能被"执行",需要同时满足:
-
拥有x权限
-
是有效的可执行文件格式(二进制程序或带Shebang的脚本)
只有x权限但内容是乱码,执行也会报错。
六、本篇核心速查表
用户管理命令
| 命令 | 功能 |
|---|---|
sudo useradd -m -s /bin/bash 用户名 |
创建用户(带家目录) |
sudo passwd 用户名 |
设置/修改密码 |
su - 用户名 |
切换用户(加载环境) |
id 用户名 |
查看用户信息 |
权限速查
| 类型 | r(读) | w(写) | x(执行) |
|---|---|---|---|
| 文件 | 查看内容 | 修改内容 | 作为程序运行 |
| 目录 | 列出文件(ls) | 增删文件(touch/rm) | 进入目录(cd) |
权限的数字表示
| 数字 | 权限组合 | 含义 |
|---|---|---|
| 4 | r-- | 只读 |
| 5 | r-x | 读+执行 |
| 6 | rw- | 读+写 |
| 7 | rwx | 全部权限 |
七、动手练习
bash
# 1. 创建一个新用户(需要sudo权限)
sudo useradd -m -s /bin/bash testuser
# 2. 为新用户设置密码
sudo passwd testuser
# 3. 切换到新用户
su - testuser
# 4. 验证当前身份
whoami
pwd # 应该显示 /home/testuser
# 5. 尝试访问/root目录(应该失败)
ls /root
# 6. 退出,回到原用户
exit
# 7. (如果原用户有sudo权限)给testuser添加sudo权限
sudo visudo
# 添加一行:testuser ALL=(ALL) ALL
# 8. 清理:删除测试用户
sudo userdel -r testuser # -r 同时删除家目录
八、本篇小结
今天的内容是Linux安全体系的基石,三个核心要点:
-
root是神,但不要住在神殿里------日常使用普通账户,必要时用sudo提权
-
su和sudo各司其职------su用于切换用户,sudo用于临时提权
-
rwx对文件和目录的含义不同------文件的x是执行,目录的x是进入;目录的w权限尤其危险
本篇我们主要讲解了权限的基本概念,但还有两个重要问题没有展开:
-
如何用
chmod修改权限?(数字法和符号法) -
如何用
chown改变文件所有者?
这些内容,我们将在下一篇继续深入。
九、下篇预告
下一篇我们将继续权限管理的下半部分------用户与权限管理(下) 。你将学到chmod的数字计算逻辑(4读2写1执行怎么算)、chown改变文件所属主和组、以及SUID、SGID、粘滞位这三个特殊权限的作用。特别是粘滞位------它解释了为什么/tmp目录所有人都能写文件,但只能删自己的文件。
延伸思考 :执行ls -l /,观察各目录的权限。你会发现/tmp的权限是drwxrwxrwt,最后一位是t而不是x。这个t就是粘滞位(Sticky Bit),它有什么特殊作用?下一篇揭晓答案。