三、Linux用户与权限管理详解
作者:IvanCodes
日期:2025年7月29日
专栏:Linux教程
思维导图
一、Linux 用户与组管理
1.1 用户管理命令
Linux是一个多用户操作系统,精确地管理用户是系统安全和资源分配的核心。
创建用户 (useradd
)
语法结构: useradd [选项] 用户名
常用选项:
-u <UID>
: 指定用户ID (UID)。系统会自动分配一个,但可以手动指定。
-g <组名或GID>
: 指定初始组 (Primary Group)。用户登录后所属的默认组。
-G <组名列表>
: 指定附加组 (Supplementary Groups)。用户可以同时属于多个附加组。
-d <家目录>
: 指定用户的家目录。如果省略,默认为 /home/用户名
。
-s <Shell路径>
: 指定用户的登录Shell。/sbin/nologin
或 /bin/false
用于创建不能登录系统的服务账户。
-c <注释>
: 为用户添加注释或描述信息 (Comment),例如全名或部门。
-m
: 创建家目录 (如果不存在)。这是非常常用的选项。
-M
: 不创建家目录。
代码示例:
# 创建一个名为 newuser 的普通用户,自动创建家目录并使用默认设置
useradd -m newuser# 创建一个名为 ftpuser 的系统服务用户,不创建家目录,禁止其登录
useradd -M -s /sbin/nologin ftpuser# 创建一个名为 devuser 的用户,添加注释,指定UID、主组和附加组
groupadd developers
groupadd testers
useradd -u 1001 -g developers -G testers -c "Senior Developer" -m -s /bin/bash devuser
设置密码 (passwd
)
语法结构: passwd [选项] [用户名]
常用选项:
-l
: 锁定用户账户 (Lock)。
-u
: 解锁用户账户 (Unlock)。
-d
: 删除用户密码,使其无需密码即可登录 (不安全,慎用)。
-S
: 显示账户状态 (Status)。
代码示例:
# 为用户 newuser 设置密码 (由root执行)
passwd newuser# 锁定用户 devuser 的账户,使其无法登录
passwd -l devuser# 查看用户 devuser 的密码状态
passwd -S devuser# 解锁用户 devuser
passwd -u devuser
修改用户 (usermod
)
语法结构: usermod [选项] 用户名
常用选项: (大部分与 useradd
相同,用于修改现有属性)
-l <新用户名>
: 修改用户名 (Login name)。
-u <新UID>
: 修改用户ID。
-g <新主组>
: 修改用户的主组。
-G <新附加组列表>
: 覆盖用户现有的附加组列表。
-aG <组名>
: 追加一个或多个附加组,-a
(append) 必须和 -G
一起使用,这是最常用的添加组的方式。
-d <新家目录>
: 修改用户的家目录。配合 -m
(move) 可以移动现有家目录内容。
-s <新Shell>
: 修改用户的登录Shell。
-c <新注释>
: 修改用户的注释。
代码示例:
# 将用户 devuser 的用户名修改为 senior_dev
usermod -l senior_dev devuser# 将用户 newuser 追加到 sudoers 和 docker 两个附加组中
usermod -aG sudoers,docker newuser# 复杂的组合修改:为用户 user10 修改UID, 注释, 家目录, Shell, 主组, 并覆盖其附加组为 group21
# 假设组 group20 和 group21 已存在
usermod -u 1020 -c "Test User 100" -d /home/wx -s /bin/bash -g group20 -G group21 user10
删除用户 (userdel
)
语法结构: userdel [选项] 用户名
常用选项:
-r
: 同时删除用户的家目录及其内容。这是非常常用的选项,以避免留下孤立文件。
代码示例:
# 只删除用户 newuser,保留其家目录和邮件池
userdel newuser# 彻底删除用户 ftpuser,包括其家目录和邮件池
userdel -r ftpuser
1.2 组管理命令
用户组是管理具有相同权限用户的一种方式。
创建组 (groupadd
)
语法结构: groupadd [选项] 组名
常用选项:
-g <GID>
: 指定组ID (GID)。
代码示例:
# 创建一个名为 developers 的组
groupadd developers
修改组 (groupmod
)
语法结构: groupmod [选项] 组名
常用选项:
-n <新组名>
: 修改组名。
-g <新GID>
: 修改组ID。
代码示例:
# 将 developers 组改名为 webdevs
groupmod -n webdevs developers
删除组 (groupdel
)
语法结构: groupdel 组名
代码示例:
# 删除 webdevs 组
groupdel webdevs
1.3 相关配置文件与命令
/etc/passwd
: 存储用户信息。/etc/shadow
: 存储加密密码和策略。/etc/group
: 存储组信息。id [用户名]
: 查看用户的UID, GID和所属组信息。groups [用户名]
: 查看用户所属的所有组。
代码示例:
# 查看用户 newuser 的详细ID信息
id newuser# 查看当前用户所属的所有组
groups
二、文件权限管理
2.1 理解文件权限
使用 ls -l
命令可以查看文件的详细信息,其中第一列就是权限描述。
示例: -rwxr-xr-- 1 user group 4096 Jan 1 10:00 filename
权限字段解析 (共10个字符):
- 第1位: 文件类型。
-
(普通文件),d
(目录),l
(符号链>接)。- 第2-4位: 所有者 (Owner/User) 的权限。
- 第5-7位: 所属组 (Group) 的权限。
- 第8-10位: 其他人 (Others) 的权限。
权限类型:
r
(Read): 读权限。对文件,可查看内容;对目录,可列出目录内容 (ls
)。w
(Write): 写权限。对文件,可修改内容;对目录,可在目录中创建、删除、重命名文件。x
(Execute): 执行权限。对文件,可作为程序执行;对目录,可进入该目录 (cd
)。
2.2 修改权限
chmod
(Change Mode) 命令用于修改文件或目录的访问权限。
语法结构1: 符号模式
chmod [ugoa...][+-=][rwx...] 文件或目录...
u, g, o, a
: 分别代表 用户, 组, 其他, 所有。
+, -, =
: 分别代表 添加, 移除, 设置 权限。
r, w, x
: 权限类型。
代码示例:
# 为文件 my_script.sh 的所有者添加执行权限
chmod u+x my_script.sh# 移除其他人对 my_secret.txt 的所有权限
chmod o-rwx my_secret.txt# 为组和其他人添加对 public_dir 目录的读和执行权限
chmod go+rx public_dir# 设置 my_file.txt 的权限为:所有者读写,所属组读,其他人无权限
chmod u=rw,g=r,o= my_file.txt
语法结构2: 数字模式
使用八进制数字表示权限。
r = 4
, w = 2
, x = 1
rwx
= 4+2+1 = 7
rw-
= 4+2+0 = 6
r-x
= 4+0+1 = 5
r--
= 4+0+0 = 4
代码示例:
# 设置 my_app.py 权限为 rwxr-xr-x (所有者读写执行,组和其他人读执行)
chmod 755 my_app.py# 设置 a_private_file.dat 权限为 rw------- (只有所有者可读写)
chmod 600 a_private_file.dat# 设置 a_shared_dir 目录权限为 rwxrwxr-x (所有者和组可读写执行,其他人可读执行)
chmod 775 a_shared_dir
递归修改:
-R
: 递归地修改目录及其下所有文件和子目录的权限。
# 递归地为 project_dir 目录及其所有内容添加组的写权限
chmod -R g+w project_dir
2.3 修改所有权
chown
(Change Owner) 和 chgrp
(Change Group) 用于修改文件或目录的所有者和所属组。
chown
语法结构: chown [选项] [用户][:组] 文件或目录...
代码示例:
# 将 file.txt 的所有者修改为 newuser
chown newuser file.txt# 将 dir/ 的所有者修改为 newuser,所属组修改为 developers
chown newuser:developers dir/# 递归地修改 /var/www/html 目录及其所有内容的所有权给 apache 用户和组
chown -R apache:apache /var/www/html
chgrp
语法结构: chgrp [选项] 组 文件或目录...
代码示例:
# 将 my_report.docx 的所属组修改为 editors
chgrp editors my_report.docx# 递归地将 project/ 目录及其所有内容的所属组修改为 devteam
chgrp -R devteam project/
2.4 特殊权限
- SUID (Set User ID):
s
(在所有者x
位)。当执行一个带有SUID权限的文件时,进程会以文件所有者 (通常是root) 的身份运行,而不是执行者的身份。数字表示为4000
。 - SGID (Set Group ID):
s
(在所属组x
位)。对文件,效果类似SUID (以所属组身份运行);对目录,在该目录中创建的新文件或目录会继承该目录的所属组。数字表示为2000
。 - Sticky Bit (粘滞位):
t
(在其他人x
位)。应用于目录时,只有目录所有者、文件所有者或root用户才能删除或重命名该目录下的文件,即使其他人对该目录有写权限。常用于/tmp
目录。数字表示为1000
。
代码示例:
# 为 /usr/bin/passwd 添加 SUID 权限 (它本身就有)
chmod u+s /usr/bin/passwd
# 或者使用数字模式
chmod 4755 /usr/bin/passwd# 为 /shared/project 目录添加 SGID 权限
chmod g+s /shared/project
# 或者使用数字模式
chmod 2775 /shared/project# 为 /public/upload 目录添加粘滞位
chmod +t /public/upload
# 或者使用数字模式
chmod 1777 /public/upload
三、总结
掌握这些核心命令和概念,是每一位Linux用户和系统管理员的必备技能。它们共同构成了Linux安全模型的基石,通过精确控制“谁能对什么文件做什么事”,确保了系统的安全性、稳定性和多用户环境的有序协作。
练习题
题目:
- 创建一个名为
finance
的新用户组。 - 创建一个名为
sara
的新用户,为其添加注释 “Finance Analyst”,并自动创建其家目录。 - 为用户
sara
设置一个密码。 - 创建一个名为
hr
的新用户组。 - 将用户
sara
追加到hr
组,使其同时属于默认组和hr
组。 - 创建一个名为
monthly_report.xlsx
的空文件。 - 修改
monthly_report.xlsx
的权限,使其所有者拥有读写权限,所属组拥有读权限,其他人没有任何权限。请分别使用符号模式和数字模式实现。 - 将
monthly_report.xlsx
的所有者更改为sara
。 - 将
monthly_report.xlsx
的所属组更改为finance
。 - 创建一个名为
/apps/shared_data
的目录 (可能需要sudo mkdir -p
)。 - 将
/apps/shared_data
目录的所有权同时设置为用户sara
和组finance
。 - 为
/apps/shared_data
目录设置权限,使得sara
和finance
组的成员可以在其中创建和删除文件,而其他人只能进入并读取文件。 - 为
/apps/shared_data
目录设置SGID
权限,以确保在该目录中创建的任何新文件或目录都自动属于finance
组。 - 锁定用户
sara
的账户,使其暂时无法登录。 - 彻底删除名为
sara
的用户,包括她的家目录和邮件池。
答案与解析:
- 创建
finance
组:
groupadd finance
解析: groupadd
是创建新用户组的标准命令。
- 创建用户
sara
:
useradd -m -c "Finance Analyst" sara
解析: -m
创建家目录,-c
添加注释。未指定主组,将自动创建一个同名的 sara
组作为其主组。
- 为
sara
设置密码:
passwd sara
解析: passwd
命令后跟用户名,允许root用户为指定用户设置密码,执行后会提示输入新密码。
- 创建
hr
组:
groupadd hr
解析: 同第1题,创建新组。
- 将
sara
追加到hr
组:
usermod -aG hr sara
解析: usermod
用于修改用户属性。-aG
将用户追加到指定的附加组,而不会影响其已有的组关系。
- 创建空文件:
touch monthly_report.xlsx
解析: touch
命令可以创建空文件。
- 修改
monthly_report.xlsx
权限:- 符号模式:
chmod u=rw,g=r,o= monthly_report.xlsx
- 数字模式:
chmod 640 monthly_report.xlsx
解析: 符号模式 u=rw,g=r,o=
精确设置了三类用户的权限。数字模式 640
是 rw-
(4+2=6), r--
(4), ---
(0) 的八进制表示。
- 更改文件所有者:
chown sara monthly_report.xlsx
解析: chown
命令用于改变文件的所有者。
- 更改文件所属组:
chgrp finance monthly_report.xlsx
解析: chgrp
命令用于改变文件的所属组。
- 创建目录:
sudo mkdir -p /apps/shared_data
解析: mkdir -p
可以创建多级目录。在根目录下创建目录通常需要 sudo
权限。
- 同时更改所有者和所属组:
sudo chown sara:finance /apps/shared_data
解析: chown
命令使用 用户:组
的格式可以一次性修改所有者和所属组。
- 设置目录权限:
sudo chmod 775 /apps/shared_data
解析: 775
对应 rwxrwxr-x
。这意味着所有者(sara
)和所属组(finance
)成员拥有读、写(可以在目录中增删文件)、执行(可以进入目录)的全部权限。其他人只有读和执行权限。
- 设置 SGID:
sudo chmod g+s /apps/shared_data
# 或者,结合上一步的权限
sudo chmod 2775 /apps/shared_data
解析: g+s
在现有权限基础上添加SGID位。数字模式2775
中的2
代表SGID,775
是基本权限。设置后,该目录权限会显示为 drwxrwsr-x
。
- 锁定用户账户:
passwd -l sara
解析: passwd
的 -l
选项用于锁定用户的密码,使其无法登录。
- 彻底删除用户
sara
:
userdel -r sara
解析: userdel
的 -r
选项会一并删除用户的家目录 (/home/sara
) 和邮件池,实现彻底清理。