第 5/30 天
引言
多用户支持是 Linux 系统区别于 Windows 单用户系统的核心设计理念之一。Ubuntu 继承自 Unix 的”一切皆文件”哲学,而文件的访问权限和用户身份管理,则是整个系统安全模型的基石。
很多新手在 Ubuntu 上遇到权限问题时往往手足无措——”Permission denied” 是最常见的报错;”为什么我装了 sudo 却还是提权失败?”是论坛上出现频率最高的问题之一。理解用户与权限管理,不仅是 Ubuntu 入门的关键一步,更是从桌面用户过渡到系统管理员的必经之路。
本文将系统讲解 Ubuntu 中的用户管理命令(useradd、usermod、passwd、userdel)和文件权限管理命令(chmod、chown、umask),并通过大量实战示例帮助你真正掌握这些核心工具。
核心概念
Linux 用户体系
Ubuntu 中的用户分为三类:
| 用户类型 | UID 范围 | 说明 |
|---|---|---|
| root(超级用户) | 0 | 系统最高权限,可执行任何操作 |
| 系统用户 | 1~999 | 运行系统服务,如 www-data、sshd、mysql |
| 普通用户 | 1000+ | 日常操作的用户,权限受限 |
每个用户有一个唯一的 UID(用户 ID)和一个 GID(主组 ID)。用户信息存储在以下文件中:
/etc/passwd → 用户账户信息
/etc/shadow → 密码哈希(仅 root 可读)
/etc/group → 用户组信息
文件权限的三元组模型
每个文件或目录有三组权限,分别针对文件所有者、所属组和其他用户:
rwx r-x r--
owner group other
每组权限由三个位组成:
| 权限 | 文件 | 目录 |
|---|---|---|
| r (4) | 读取文件内容 | 列出目录内容 |
| w (2) | 修改文件内容 | 创建/删除文件 |
| x (1) | 执行文件 | 进入目录 |
权限表示法:可以用符号(rwxr-xr--)或八进制数字(754)表示。
特殊权限位
除了 rwx 三位,还有三个特殊权限位:
| 特殊权限 | 数值 | 符号 | 作用 |
|---|---|---|---|
| SUID | 4 | s 在所有者 x 位 |
以文件所有者的身份执行 |
| SGID | 2 | s 在组 x 位 |
以文件所属组的身份执行 |
| Sticky Bit | 1 | t 在其他用户 x 位 |
仅文件所有者可删除(如 /tmp) |
实战步骤
1. 用户管理命令
1.1 创建用户 — useradd
useradd 是 Linux 最底层的用户创建命令,但 Ubuntu 上推荐使用 adduser(一个更友好的 Perl 脚本,自动创建家目录、设置密码等)。不过了解 useradd 的参数对系统管理至关重要:
# 创建用户并指定家目录、shell、UID
sudo useradd -m -d /home/zhangsan -s /bin/bash -u 1001 zhangsan
# 参数说明:
# -m 自动创建家目录
# -d 指定家目录路径
# -s 指定登录 shell
# -u 指定 UID
# -G 指定附加组
# 为新建用户设置密码
sudo passwd zhangsan
# 查看用户信息
id zhangsan
# 输出示例:
# uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan)
1.2 修改用户 — usermod
usermod 用于修改已有用户的属性,是日常管理中最常用的命令之一:
# 将用户加入 sudo 组(赋予管理员权限)
sudo usermod -aG sudo zhangsan
# 注意:-a 必须与 -G 一起使用,否则会移除用户不在 -G 列表中的其他组
# 错误写法:sudo usermod -G sudo zhangsan(会移除所有其他组)
# 修改用户登录 shell
sudo usermod -s /bin/zsh zhangsan
# 修改用户的家目录
sudo usermod -d /home/newhome -m zhangsan
# 锁定用户(禁止登录)
sudo usermod -L zhangsan
# 解锁用户
sudo usermod -U zhangsan
# 修改用户 UID
sudo usermod -u 2000 zhangsan
1.3 删除用户 — userdel
# 删除用户但不删除家目录
sudo userdel zhangsan
# 删除用户并同时删除家目录和邮件池
sudo userdel -r zhangsan
# 强制删除(即使用户当前登录中)
sudo userdel -f zhangsan
1.4 查看登录用户
# 查看当前登录用户
who
# 输出示例:
# zhangsan pts/0 2026-07-20 14:30 (192.168.1.100)
# lisi pts/1 2026-07-20 14:35 (192.168.1.101)
# 查看当前登录用户及正在执行的操作
w
# 查看最近登录记录
last
2. sudo 提权机制
2.1 sudo 的工作原理
sudo 允许普通用户以超级用户(或其他用户)的身份执行命令。其配置存于 /etc/sudoers 文件中。
# 查看当前用户的 sudo 权限
sudo -l
# 输出示例:
# Matching Defaults entries for zhangsan on ubuntu-server:
# env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:...
#
# User zhangsan may run the following commands on ubuntu-server:
# (ALL : ALL) ALL
2.2 sudoers 配置详解
sudoers 文件必须通过 visudo 命令编辑,它会进行语法检查,防止配置错误导致 sudo 完全失效:
# 安全地编辑 sudoers 文件
sudo visudo
# 或使用特定编辑器
sudo EDITOR=nano visudo
常用配置规则:
# 格式:用户/组 主机=(可切换身份:可切换组) 命令列表
# 允许 zhangsan 执行任何命令
zhangsan ALL=(ALL:ALL) ALL
# 允许 %sudo 组的所有成员执行任何命令(Ubuntu 默认配置)
%sudo ALL=(ALL:ALL) ALL
# 允许 zhangsan 仅执行 apt 和 systemctl 命令(无需密码)
zhangsan ALL=(root) NOPASSWD: /usr/bin/apt, /usr/bin/systemctl
# 允许 lisi 仅执行 shutdown 命令
lisi ALL=(root) /usr/sbin/shutdown
# 允许 backup 组以 www-data 身份执行 rsync
%backup ALL=(www-data) /usr/bin/rsync
2.3 sudo 日志审计
所有 sudo 操作都会被记录,方便安全审计:
# 查看 sudo 日志
sudo cat /var/log/auth.log | grep sudo
# 输出示例:
# Jul 20 14:35:01 ubuntu-server sudo: zhangsan : TTY=pts/0 ; PWD=/home/zhangsan ; USER=root ; COMMAND=/usr/bin/apt update
# Jul 20 14:36:12 ubuntu-server sudo: lisi : command not allowed ; TTY=pts/1 ; PWD=/home/lisi ; USER=root ; COMMAND=/usr/bin/passwd root
3. 文件权限管理
3.1 查看权限 — ls -l
# 查看文件权限详细信息
ls -l /etc/nginx/nginx.conf
# 输出示例:
# -rw-r--r-- 1 root root 2741 Jun 15 10:23 /etc/nginx/nginx.conf
# ^^^^^^^^^^ ^^^^ ^^^^
# 权限位 所有者 所属组
# 查看目录权限
ls -ld /var/www
# drwxr-xr-x 3 root root 4096 Jul 20 10:00 /var/www
3.2 修改权限 — chmod
chmod 有两种模式:符号模式和数字模式。
符号模式:
# 为所有者添加执行权限
chmod u+x script.sh
# 为组和其他用户添加读取权限
chmod go+r script.sh
# 移除所有者的写权限
chmod u-w script.sh
# 为所有用户(ugo)添加执行权限
chmod a+x script.sh
# 为目录设置权限(递归)
chmod -R u+rwX /var/www/
# 注意:大写 X 表示"仅对目录或已有执行权限的文件添加执行权限"
数字模式(推荐,更精确):
# 754 = rwxr-xr--
# 7 = 4+2+1 (rwx) 所有者
# 5 = 4+0+1 (r-x) 所属组
# 4 = 4+0+0 (r--) 其他用户
chmod 754 script.sh
# 常用权限组合:
# 777 = rwxrwxrwx → 完全开放(不安全,仅临时使用)
# 755 = rwxr-xr-x → 可执行文件标准权限
# 700 = rwx------ → 私有脚本
# 644 = rw-r--r-- → 普通文件标准权限
# 600 = rw------- → 敏感文件(如 SSH 私钥)
# 400 = r-------- → 配置文件(只读)
# 设置 SSH 私钥的正确权限
chmod 600 ~/.ssh/id_rsa
# 设置 SSH 公钥的正确权限
chmod 644 ~/.ssh/id_rsa.pub
# 设置 .ssh 目录的正确权限
chmod 700 ~/.ssh
3.3 修改所有者 — chown
# 修改文件的所有者
sudo chown zhangsan file.txt
# 同时修改所有者和所属组
sudo chown zhangsan:developers file.txt
# 仅修改所属组
sudo chown :developers file.txt
# 递归修改目录及其所有子文件
sudo chown -R zhangsan:zhangsan /home/zhangsan/
# 修改符号链接本身(而非目标文件)
sudo chown --no-dereference zhangsan symlink
3.4 修改所属组 — chgrp
# 修改文件所属组
sudo chgrp www-data /var/www/index.html
# 递归修改目录所属组
sudo chgrp -R www-data /var/www/
3.5 默认权限掩码 — umask
umask 决定新创建文件/目录的默认权限:
# 查看当前 umask 值
umask
# 输出:0022
# 权限计算规则:
# 文件默认最大权限 = 666(-rw-rw-rw-)
# 目录默认最大权限 = 777(drwxrwxrwx)
# 实际权限 = 最大权限 - umask
#
# umask=022 时:
# 文件:666 - 022 = 644(rw-r--r--)
# 目录:777 - 022 = 755(rwxr-xr-x)
# 临时修改 umask
umask 0027
# 永久修改(写入 ~/.bashrc 或 ~/.profile)
echo "umask 0027" >> ~/.bashrc
4. 综合实战:建立多用户开发环境
以下是一个完整的企业级多用户开发环境配置示例:
#!/bin/bash
# 搭建团队开发环境
# 1. 创建用户组
sudo groupadd developers
sudo groupadd devops
# 2. 创建用户并加入组
sudo useradd -m -s /bin/bash -G developers,devops alice
sudo useradd -m -s /bin/bash -G developers bob
sudo useradd -m -s /bin/bash -G devops charlie
# 3. 设置密码
echo "alice:Pass123!" | sudo chpasswd
echo "bob:Pass456!" | sudo chpasswd
echo "charlie:Pass789!" | sudo chpasswd
# 4. 创建共享项目目录
sudo mkdir -p /opt/projects/shared
sudo chown root:developers /opt/projects/shared
sudo chmod 2775 /opt/projects/shared
# 2 表示 SGID:在该目录下创建的文件自动继承 group 为 developers
# 775 表示组内成员可读写
# 5. 设置默认权限(组内成员可写入)
echo "umask 0002" | sudo tee -a /etc/profile.d/dev-umask.sh
# 0002 使得新文件权限为 664,新目录权限为 775
5. 权限管理最佳实践
{
"best_practices": [
{
"rule": "最小权限原则",
"description": "只给用户完成任务所需的最小权限",
"example": "备份用户只需要 rsync 权限,不需要 sudo 全部权限"
},
{
"rule": "使用组管理替代逐个授权",
"description": "将用户加入组,为组设置权限而非逐个用户",
"example": "使用 www-data 组管理 Web 开发人员"
},
{
"rule": "SSH 私钥必须 600",
"description": "太宽松的权限会导致 SSH 拒绝使用该密钥",
"example": "chmod 600 ~/.ssh/id_rsa"
},
{
"rule": "Web 目录 755,文件 644",
"description": "Web 服务器不应赋予写入权限",
"example": "find /var/www -type d -exec chmod 755 {} ;"
}
]
}
常见问题
Q1: 为什么我执行 sudo 时提示”xxx is not in the sudoers file”?
这是最常见的 sudo 错误。解决办法:
# 方法 1:用 root 用户将用户加入 sudo 组
su -
usermod -aG sudo zhangsan
# 方法 2:或编辑 sudoers 文件
su -
visudo
# 添加:zhangsan ALL=(ALL:ALL) ALL
Q2: 为什么我修改了 /etc/passwd 文件后系统异常?
永远不要手动编辑 /etc/passwd、/etc/shadow、/etc/group! 使用 vipw 和 vigr 命令替代:
# 安全编辑 passwd 文件
sudo vipw
# 安全编辑 group 文件
sudo vigr
Q3: 为什么设置了 chmod 777 还是无法访问目录?
目录权限需要执行位(x)才能进入。即使目录有 r 权限,没有 x 权限也无法 cd 进入:
# 正确的目录权限
chmod 755 /path/to/dir
# 错误:只有 rw 没有 x
chmod 644 /path/to/dir # 无法进入目录!
Q4: 如何批量修改目录下所有文件的权限?
# 设置目录为 755,文件为 644
find /var/www -type d -exec chmod 755 {} ;
find /var/www -type f -exec chmod 644 {} ;
# 一行命令搞定
chmod 755 /var/www && find /var/www -type f -exec chmod 644 {} ;
Q5: su 和 sudo su 有什么区别?
# su - 切换到 root(需要 root 密码)
su -
# sudo su - 切换到 root(需要当前用户密码,无需 root 密码)
sudo su -
# 推荐使用 sudo -i,更安全
sudo -i
# sudo -s 保留当前用户的环境变量
sudo -s
总结
本文详细讲解了 Ubuntu 用户与权限管理的核心知识:
- 用户管理:
useradd创建用户、usermod修改用户属性、userdel删除用户、passwd管理密码 - sudo 提权:
/etc/sudoers配置文件的精细权限控制,支持 NOPASSWD 和命令级别限制 - 文件权限:
chmod的符号模式和数字模式、chown修改所有者、chmod的数字权限体系 - 安全实践:最小权限原则、组管理、umask 默认权限设置
权限管理是 Ubuntu 系统安全的第一道防线。掌握这些命令,你就能在日常工作中游刃有余地管理用户和文件访问权限,避免”Permission denied”的尴尬。
下期预告
第 6 天:软件包管理——apt、dpkg、snap、flatpak 全面对比与实践
Ubuntu 拥有丰富的软件包管理生态。从传统的 apt 和 dpkg,到新兴的 snap 和 flatpak 容器化包管理,每种方式各有优劣。下一期我们将全面对比这四种包管理工具,并实战演示如何高效管理 Ubuntu 上的软件。
📖 系列目录
- 第 1 天:Ubuntu 简介与版本选择——为什么选择 Ubuntu 作为操作系统
- 第 2 天:手把手安装 Ubuntu——从 U 盘启动到分区方案详解
- 第 3 天:Ubuntu 桌面环境初探——GNOME 桌面、设置与软件中心使用
- 第 4 天:Ubuntu 终端基础——Shell 命令、文件系统结构与路径导航
- 第 5 天:用户与权限管理——useradd、usermod、sudo、chown、chmod 详解 ← 本篇
- 第 6 天:软件包管理——apt、dpkg、snap、flatpak 全面对比与实践 🔜
- 第 7 天:文件与文本操作——ls、cp、mv、find、grep、sed、awk 实战 🔜
- 更多精彩内容,敬请期待…















暂无评论内容