Ubuntu 系统系列 | 第 5 天:用户与权限管理——useradd、usermod、sudo、chown、chmod 详解

第 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 使用 vipwvigr 命令替代:

# 安全编辑 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: susudo su 有什么区别?

# su - 切换到 root(需要 root 密码)
su -

# sudo su - 切换到 root(需要当前用户密码,无需 root 密码)
sudo su -

# 推荐使用 sudo -i,更安全
sudo -i

# sudo -s 保留当前用户的环境变量
sudo -s

总结

本文详细讲解了 Ubuntu 用户与权限管理的核心知识:

  1. 用户管理useradd 创建用户、usermod 修改用户属性、userdel 删除用户、passwd 管理密码
  2. sudo 提权/etc/sudoers 配置文件的精细权限控制,支持 NOPASSWD 和命令级别限制
  3. 文件权限chmod 的符号模式和数字模式、chown 修改所有者、chmod 的数字权限体系
  4. 安全实践:最小权限原则、组管理、umask 默认权限设置

权限管理是 Ubuntu 系统安全的第一道防线。掌握这些命令,你就能在日常工作中游刃有余地管理用户和文件访问权限,避免”Permission denied”的尴尬。


下期预告

第 6 天:软件包管理——apt、dpkg、snap、flatpak 全面对比与实践

Ubuntu 拥有丰富的软件包管理生态。从传统的 apt 和 dpkg,到新兴的 snap 和 flatpak 容器化包管理,每种方式各有优劣。下一期我们将全面对比这四种包管理工具,并实战演示如何高效管理 Ubuntu 上的软件。


📖 系列目录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容