
Linux 基础实战课 ③
用户管理与权限控制,这些坑我替你踩过了
Linux基础 实战课
Linux 基础实战课 · 第3篇
💬 有一次给客户交付 VDI 项目,运维同事嫌每次操作都要切 root 麻烦,就直接把业务账号加进了 sudoers,并且没加任何限制——等于给了他 root 权限。后来有个同事手滑跑了一条 rm -rf,把 /var/lib/mysql 整个目录删了,数据库直接崩了。
这件事之后我意识到:Linux 用户权限管理,不只是「会用命令」,更重要的是「知道边界在哪、坑在哪」。这篇文章就把我遇到过的坑,连着正确做法,一起讲清楚。
一、Linux 的用户体系:理清楚才不会乱
Linux 是多用户操作系统,每个用户都有自己的身份,系统通过 UID(用户ID)来区分。搞清楚用户分类,后面的权限管理才不会乱。
用户类型 | UID 范围 | 说明 |
root 超级用户 | 0 | 拥有系统所有权限,操作不受任何限制 |
系统用户 | 1 ~ 999 | 运行系统服务用的,不用来登录(如 www-data、mysql) |
普通用户 | 1000 以上 | 我们日常创建的账号,权限受限制 |
💡 查看当前用户是谁,用 whoami;查看自己的 UID 和所属组,用 id。这两个命令我几乎每次 SSH 进服务器都会先敲一遍。
查看当前用户信息
whoami# 显示当前用户名
id# 显示 UID、GID 和所属组
# 示例输出:uid=1000(student) gid=1000(student) groups=1000(student),27(sudo)
二、用户管理:创建、修改、删除
用户管理这部分命令不多,但坑不少。我一个一个说。
useradd — 创建新用户
创建用户
sudo useradd alice# 创建用户(不创建家目录)
sudo useradd -m alice# 创建用户 + 同时创建家目录(推荐)
sudo useradd -m -s /bin/bash alice# 指定 shell 为 bash
sudo useradd -m -G sudo alice# 创建用户并加入 sudo 组
⚠️ 单独 useradd alice 不会创建家目录,SSH 登录后会报错。一定要加 -m 参数!这是我第一次配环境时踩的坑。
passwd — 设置或修改密码
设置密码
sudo passwd alice# 给 alice 设置密码(root 操作,不需要知道原密码)
passwd# 修改自己的密码(需要先输入当前密码)
💡 新建用户必须立刻设密码,否则账号是锁定状态,无法登录。这步经常被忘掉。
usermod — 修改用户信息
常用修改操作
sudo usermod -aG sudo alice# 把 alice 加入 sudo 组(-a 追加,不覆盖)
sudo usermod -aG docker alice# 把 alice 加入 docker 组
sudo usermod -s /bin/zsh alice# 修改登录 shell
sudo usermod -l newname alice# 修改用户名
⚠️ -aG 和 -G 的区别非常重要:只用 -G 会覆盖用户现有的所有附加组,加了 -a 才是追加。我见过有人因为这个把自己踢出 sudo 组,然后就再也 sudo 不了……
userdel — 删除用户
删除用户
sudo userdel alice# 只删除用户,保留家目录
sudo userdel -r alice# 删除用户 + 删除家目录(不可恢复!)
💡 删人之前先确认他的家目录里有没有重要数据。-r 是删家目录,操作不可逆。
命令 | 用途 | 常用参数 |
useradd | 创建新用户 | -m(创建家目录), -s(指定shell), -G(加入组) |
passwd | 设置/修改密码 | 不带参数改自己的,加用户名改别人的(需root) |
usermod | 修改用户属性 | -aG(追加加组), -s(改shell), -l(改用户名) |
userdel | 删除用户 | -r(同时删家目录) |
id | 查看用户身份 | 不带参数查自己,加用户名查别人 |
三、组管理:为什么要用组?
用户组是 Linux 权限管理的重要工具。比如你有一个 /data 目录,希望 alice 和 bob 都能读写,但其他人不行——最优雅的做法是创建一个组,把他们都加进去,然后设置目录归属这个组。
groupadd / groupdel — 创建和删除组
组管理命令
sudo groupadd developers# 创建 developers 组
sudo usermod -aG developers alice# 把 alice 加入 developers 组
sudo usermod -aG developers bob# 把 bob 也加入
sudo groupdel developers# 删除组(不会删用户)
💡 把一个目录的所属组设为 developers,然后 chmod g+rw,这个组里的用户就都有读写权限了。这是生产环境里多人协作的标准做法。
查看用户在哪些组
查看组信息
groups alice# 查看 alice 属于哪些组
cat /etc/group# 查看所有组及其成员
四、sudo 权限配置:精细化控制比「全给」更安全
很多人配 sudo 只会把用户加进 sudo 组,完事。但这等于把整个 root 权限都给出去了,风险很高。用 sudoers 文件可以精确控制:这个用户能用 sudo 执行哪些命令、不需要密码执不执行。
把用户加入 sudo 组(最简单的方式)
加入 sudo 组
sudo usermod -aG sudo alice
加进去之后,alice 用 sudo 可以执行所有命令,效果等同于 root。适合受信任的管理员账号。
用 visudo 精细控制权限(推荐)
编辑 sudoers 配置文件,强烈建议用 visudo 命令,它会在保存前做语法检查,避免配错了把自己锁在外面。
打开 sudoers 配置
sudo visudo
配置格式
# 格式:用户名主机=(以哪个用户执行)命令
aliceALL=(ALL:ALL) ALL# 给 alice 完整 sudo 权限
aliceALL=(ALL) NOPASSWD: ALL# 完整权限 + 不需要输密码
# 只允许 alice 执行 systemctl 和 nginx 相关命令
aliceALL=(ALL) /usr/bin/systemctl, /usr/sbin/nginx
⚠️ NOPASSWD: ALL 要谨慎使用。我那个同事删数据库的事,就是因为用了这个配置——他以为只是重启服务,结果命令敲错了,sudo 直接就执行了,没有密码确认的缓冲机会。
五、/etc/passwd 和 /etc/shadow:用户信息存在哪里
用户信息不是凭空来的,Linux 把它们存在两个文件里。了解这两个文件,遇到账号问题才知道去哪查。
/etc/passwd — 用户基本信息
查看用户文件
cat /etc/passwd | grep alice
# 输出格式:用户名:x:UID:GID:注释:家目录:shell
# alice:x:1001:1001::/home/alice:/bin/bash
💡 第二个字段是 x,表示密码存在 /etc/shadow 里(加密的)。以前老系统密码直接存在这里,现在都移到 shadow 了,更安全。
/etc/shadow — 加密密码存放地
查看 shadow 文件(需要 root)
sudo cat /etc/shadow | grep alice
# 输出格式:用户名:加密密码:最后修改日期:...
如果密码字段是 ! 或 *,说明账号被锁定,无法密码登录。可以用 passwd -u alice 解锁。
文件 | 存放内容 | 权限 |
/etc/passwd | 用户名、UID、家目录、shell | 所有人可读 |
/etc/shadow | 加密后的密码、密码策略 | 只有root可读 |
/etc/group | 组名、GID、组成员列表 | 所有人可读 |
六、真实案例:给新员工开服务器账号的正确流程
结合前面的内容,我把实际工作中给新员工开服务器账号的步骤整理成一个标准流程,可以直接抄去用。
标准开账号流程
# 1. 创建用户(带家目录 + bash shell)
sudo useradd -m -s /bin/bash -c '新员工张三' zhangsan
# 2. 设置初始密码(并要求首次登录后修改)
sudo passwd zhangsan
sudo chage -d 0 zhangsan# 标记密码已过期,强制首次登录修改
# 3. 按需加入组(只加必要的)
sudo usermod -aG developers zhangsan# 开发组
# 4. 如果需要 sudo 权限,用 visudo 精确配置
sudo visudo
# 加一行:zhangsan ALL=(ALL) /usr/bin/systemctl
# 5. 验证账号
id zhangsan
su - zhangsan# 切换到该账号测试一下
✅ 这个流程的核心原则:最小权限——用户只拥有完成工作所必需的权限,多余的一律不给。
总结
• useradd -m 建用户,passwd 设密码,这两步缺一不可
• usermod -aG 追加加组,少了 -a 会覆盖掉原有组,踩过才知道有多坑
• sudo 权限尽量用 visudo 精细配置,不要直接给 NOPASSWD: ALL
• /etc/passwd 存用户基本信息,/etc/shadow 存加密密码,/etc/group 存组信息
• 最小权限原则:用户只拥有做好工作所必需的权限
下篇预告:《Linux 基础实战课④|软件包管理:apt 和 yum 怎么装软件、卸载软件、换源加速》。
💬 你们公司怎么管理服务器账号的?有没有因为权限问题出过事故?
评论区聊聊,正经经验和血泪教训都欢迎
👍 点赞💬 留言🔄 转发给需要的朋友
有问题欢迎评论区留言,看到都会回复