《Linux系统编程之入门基础》【权限管理】
【权限管理】目录
- 前言:
- ---------------理论知识---------------
- 1. 人人都是root?
- 2. 权限到底是个什么东西?
- 3. 权限字符串是什么鬼?
- 4. 所属组存在的意义是什么?
- 5. 权限存在的价值?
- 6. 系统如何确定用户的权限身份?
- 7. 权限?可笑!!!
- 8. “可执行权限”与“可执行”?
- 9. 毁灭你,与你何干!!!
- 10. 为什么要引入粘滞位?
- ---------------基础命令---------------
- ------- 用户信息 -------
- 一、id
- 二、passwd
- ------- 身份切换 -------
- 一、su
- 二、sudo
- ------- 用户与组 -------
- 一、useradd
- 二、usermod
- 三、userdel
- 四、groupadd
- 五、groupmod
- 六、groupdel
- ------- 权限管理 -------
- 一、chmod
- 二、chown
- 三、chgrp
- 四、umask
- ------- 文件属性 -------
- 一、file

往期《Linux系统编程》回顾:
/------------ 入门基础 ------------/
【Linux的前世今生】
【Linux的环境搭建】
【Linux基础 理论+命令】(上)
【Linux基础 理论+命令】(下)
前言:
hi ~ 小伙伴们,大家好!(ノ≧∀≦)ノ
昨天刚过霜降节气,今天就迎来了程序员节啦~ 鼠鼠来考考大家:你们知道为什么每年的 10 月 24 日是程序员节吗? (=①ω①=)
其实答案藏在计算机的核心计数方式里!计算机世界以二进制为基础,“1024” 正是二进制计数中极具代表性的数字 —— 它不仅是 2 的 10 次方,更是计算机存储单位的关键换算系数,比如 1KB=1024B、1MB=1024KB 等等。 (☆ω☆)
把 10 月 24 日(10/24)定为程序员节,正是对这个行业核心技术符号的呼应,有着满满的行业辨识度!✧。٩(ˊᗜˋ)و✧*。
言归正传,今天咱们要学习的是《Linux 系统编程》入门基础的最后一章 ——【权限管理】!
学完这一章,你就成功走出新手村啦~ (≧▽≦)/ ~ 是不是有点小激动呢?啊并没有ヽ(°▽°)ノ
---------------理论知识---------------
1. 人人都是root?
我们知道,
sudo命令的核心作用是为普通用户提供临时权限提升,只需在命令前加上sudo(例如:sudo apt install 软件名),然后输入 自己的用户密码,就能暂时以 root 身份执行这条命令。这时可能有小伙伴会好奇:“哎,等一等,这里有点疑问 —— 既然输入我自己的密码,就能像 root 一样执行命令,那是不是意味着我随时能变成 root,一直拥有最高权限呢?”
哈哈好问题,其实并非如此,因为
sudo的 “临时提权” 有严格的限制:
- 范围有限:它只对当前这条加了
sudo的命令生效。
- 比如,执行
sudo rm /tmp/file后,权限会自动回落为普通用户,下一条命令如果不加sudo,仍会受限于普通用户权限- 时间窗口:即使连续使用
sudo,权限也不会永久保持。默认情况下,输入密码后有 5 分钟的 “有效期”(可通过配置修改),超时后再次使用sudo需重新输入密码,防止离开电脑时被他人滥用。- 权限可控:普通用户能通过 sudo 执行哪些命令,完全由 sudoers配置文件 决定。
- 比如,系统管理员可以精确限制只允许某个用户用
sudo执行apt安装命令,却禁止其修改系统核心配置,避免权限过度开放- sudoers文件 就类似于一个 “权限白名单”:
- 只有被列入这个文件的用户,才被允许通过
sudo命令获取临时的 root 权限- 如果用户不在其中,就无法使用
sudo,系统还会记录这种未授权的 sudo 使用尝试
简单说:
sudo更像一把 “临时借用的钥匙”—— 用完即还,且能被精确管控,既解决了普通用户偶尔需要高权限的需求,又避免了直接使用 root 账号带来的安全风险(比如:误操作删除系统文件)这也是 Linux 系统权限管理的精妙之处:
既灵活又安全
2. 权限到底是个什么东西?
权限的本质:界定 “能做什么” 和 “不能做什么” 的规则
- 它就像一道 “行为闸门”,决定了不同主体对系统资源的操作边界
权限的限制要同时满足两个条件:
针对 “角色(人)”:先明确 “谁” 在操作(是普通用户
sanqiu,还是管理员root)针对 “目标属性”:再看操作的 “对象”(比如:文件、目录)是否具备被操作的属性(比如:文件是否允许 “写”)
简言之:权限 = 角色(谁来操作) + 目标属性(操作什么、怎么操作)
3. 权限字符串是什么鬼?


在 Linux 系统中,文件(或目录)的权限信息是由十位字符组成的字符串,每一位都有特定含义。
我们以图中示例(如:
drwxr-xr-x、-rw-r--r--等)来拆解说明:
一、第一位:文件类型
权限字符串的第一个字符表示文件类型:
d:代表目录(directory),如:图中的./、../、d/都是目录-:代表普通文件,如:图中的a、b、c都是普通文件- 其他常见类型:
l(符号链接,类似 Windows 快捷方式)c(字符设备文件,如:键盘、鼠标)b(块设备文件,如:硬盘)
二、第 2 - 10 位:用户/组/其他用户的权限(3 组,每组 3 位)
权限字符串的后 9 位,每 3 位为一组,分别对应 文件所有者(user)、所属组(group)、其他用户(others) 的权限,每组内的
r、w、x代表不同权限:
r(read):读权限—— 能查看文件内容(对目录而言,能列出目录内的文件)w(write):写权限—— 能修改文件内容(对目录而言,能在目录内 创建/删除 文件)x(execute):执行权限—— 能将文件作为程序运行(对目录而言,能进入该目录)- 如果某一位是
-,则表示没有对应权限
示例 1:目录
./的权限drwxr-xr-x
- 第 1 位
d:是目录- 第 2 - 4 位
rwx:文件所有者(root) 对该目录有读(r)、写(w)、执行(x)权限- 第 5 - 7 位
r-x:所属组(root 组) 对该目录有读(r)、执行(x)权限,但没有写(-)权限- 第 8 - 10 位
r-x:其他用户 对该目录有读(r)、执行(x)权限,没有写(-)权限
示例 2:普通文件
a的权限-rw-r--r--
- 第 1 位
-:是普通文件- 第 2 - 4 位
rw-:所有者(sanqiu) 对该文件有读(r)、写(w)权限,但没有执行(-)权限(因为是普通文本类文件,不需要执行)- 第 5 - 7 位
r--:所属组(root 组) 对该文件只有读(r)权限,没有写(-)、执行(-)权限- 第 8 - 10 位
r--:其他用户 对该文件也只有读(r)权限
4. 所属组存在的意义是什么?
一、什么是所属组?
在 Linux 系统里,每个文件(或目录)都有一个 “所属用户”(即文件的所有者),同时也会归属于一个 “所属组”。
可以把 “所属组” 理解为一个用户集合 —— 多个用户能被划分到同一个组里,而文件的 “所属组” 就代表了这个文件与该用户组的关联关系。
二、为什么要有所属组?
这是为了实现更精细化的权限管理
- 在 Linux 权限体系中,权限是针对 “所有者”、“所属组”、“其他用户” 三个维度分别设置的(即 “读、写、执行” 权限可对这三类对象单独配置
- 如果只有 “所有者” 和 “其他用户” 这两个维度,当需要让一批用户(而非单个用户)对某个文件拥有特定权限时,操作会很繁琐(比如:得给每个用户单独设置权限)
- 而通过 “所属组”,我们可以把需要拥有相同权限的用户都加入同一个组,然后只需对文件的 “所属组” 配置权限,组内的所有用户就都能按照该权限规则访问文件了
5. 权限存在的价值?
这些权限的存在,是 Linux 系统安全和资源隔离 的核心:
- 确保不同用户(如:
sanqiu、qiuqiu、lighthouse)只能操作自己权限范围内的文件- 防止普通用户误操作或恶意修改系统关键文件,同时让管理员(
root)能灵活分配权限如果需要修改权限,可使用
chmod命令(如:chmod 755 文件名调整权限数值),或chown/chgrp命令修改 所有者/所属组~
6. 系统如何确定用户的权限身份?
在 Linux 系统中,系统严格按照 “所有者 → 所属组 → 其他用户” 的顺序,只匹配一次身份,然后应用对应层级的权限。
也就是说,系统会先判断用户是否是文件的所有者
若是,就应用所有者的权限
若不是,再判断是否属于文件的所属组,应用组权限
若既不是所有者也不属于所属组,才会应用其他用户的权限

步骤 1:明确文件的所有者、所属组
先看两个关键文件的权限(通过
ll命令输出):
root.txt:由root用户创建,所以 所有者是root,所属组也为root.profile:权限行显示sanqiu sanqiu,所以 所有者是sanqiu,所属组也是sanqiu
步骤 2:分析
sanqiu用户操作root.txt的权限当
sanqiu执行echo "test" >> root.txt时:
- 系统先判断:
sanqiu不是root.txt的所有者(所有者是root)- 接着判断:
sanqiu不属于root.txt的所属组(所属组是root组,sanqiu不在该组)- 因此,系统会应用 “其他用户(other)” 的权限
查看
root.txt的权限(默认新建文件权限通常为rw-r--r--,即所有者可读写、组和其他用户只读),所以 “其他用户” 只有读权限,没有写权限 → 操作被拒绝,报错Permission denied
步骤 3:分析
sanqiu用户操作.profile的权限当
sanqiu执行echo "test" >> .profile时:
- 系统先判断:
sanqiu是.profile的所有者(权限行显示所有者为sanqiu)- 因此,系统直接应用 “所有者的权限”
.profile的权限是rw-r--r--,所有者有写权限 →sanqiu能成功向文件追加内容,后续cat .profile也能看到写入的内容
7. 权限?可笑!!!
root 用户是 Linux 系统的超级用户,不受文件权限的约束
- 示例,普通用户
qiuqiu对my.txt无权限,执行echo "test" >> my.txt会被拒绝- 但是,
root用户可以无视这些权限限制,自由操作文件

8. “可执行权限”与“可执行”?
可执行权限(
x) 的含义是赋予文件 “可以被执行” 的能力
- 当一个文件拥有可执行权限时,系统才允许将其作为程序(如:脚本、二进制程序)运行
简单来说:
“可执行权限”是文件“可执行”的必要不充分条件,有了可执行权限,文件才具备了被执行的资格,但还需要满足其他条件,文件才能真正被执行。

9. 毁灭你,与你何干!!!

1. 对文件 root.txt 写入失败(“吃里爬外的东西”)
qiuqiu执行echo "test" >> root.txt时,报错Permission denied
- 原因:
root.txt的所有者是root,权限为-rw-r--r--(只有root有写权限,其他用户只有读权限)qiuqiu不是root.txt的所有者,也没有写权限,因此无法向文件写入内容
2. 对文件 root.txt 删除成功(“毁灭你,与你何干”)
虽然
qiuqiu无法写入root.txt,但执行rm root.txt时,却能成功删除该文件。
- 这是因为:删除文件的权限,取决于文件所在目录的权限,而非文件本身的权限
3. 目录 /home/qiuqiu/ 的权限主导(“我的地盘,我说的算”)
查看
/home/qiuqiu/目录的权限(ll -d /home/qiuqiu/),结果为drwxr-xr-x:
- 所有者是
qiuqiu,且qiuqiu对该目录有写权限(w)- Linux 中,“删除文件” 属于目录的写操作(因为删除文件是在目录内 “修改文件列表” 的行为)
因此:只要用户对目录有写权限,就能删除目录内的文件 —— 无论文件本身的所有者是谁、权限如何。
10. 为什么要引入粘滞位?
默认情况下,我们新建一个目录,rwx权限都要有!
- 可读权限:若目录没有可读权限,用户无法通过
ls等命令查看目录内的文件内容- 可写权限:若目录没有可写权限,用户既不能在该目录中创建新文件,也不能删除目录内已有的文件
- 可执行权限:若目录没有可执行权限,用户无法使用
cd命令进入该目录按照上述权限规则,会出现这样的情况:只要用户对某个目录拥有
写权限,即便用户对该目录内的某个文件没有写权限,也能删除这个文件。
这时你可能会说啦:“哎呀,害怕别人删除你创建的目录下的文件,只要不给它们
写权限不就行了嘛,就是创建目录的时候将目录的权限字符串设置为d rwx r-x r-x,知道了,菜就多学!”哈哈,确实啊,但是如果遇到需要多用户协作文件的场景,得把这个目录设为对所有共享用户都有
rwx权限,这时候又该怎么办呢,真让人头疼呀,你怎么不说话了,呜呜呜~
多用户文件协作的问题
当两个用户需要进行文件级别的协作时,会面临一个困境:
- 如果把共享文件放在某个私人用户的目录下(比如:
/home/XXX这类属于单个用户的目录),会存在权限管控的问题 —— 其他用户可能因目录权限限制,无法正常操作文件- 但如果放在公共目录,又可能出现 “非文件所有者误删文件”(+:非root/非共享目录所有者) 的情况(当然该文件还可能会被①超级用户 ②被设置为粘滞位的共享目录的所有者 删除掉,但是这并不是多用户文件协作时害怕的问题)
粘滞位(Sticky Bit)的解决方案
为了解决 “共享文件被非所有者误删”(+:非root/非共享目录所有者) 的问题,Linux 引入了粘滞位(权限标志位 t),它主要用于共享目录,具备以下特点:
- 允许所有用户在共享目录下新建文件
- 当一个目录被设置为"粘滞位"(用 chmod +t ),则该目录下的文件只能由:
- 该目录的所有者删除
- 超级管理员删除
- 该文件的所有者删

以目录
shared为例,其权限为drwxrwxrwt(最后一位t表示粘滞位已设置)
用户
qiuqiu尝试删除不属于自己的文件sanqiu.txt时,执行rm sanqiu.txt,系统会提示:rm: remove write-protected regular empty file 'sanqiu.txt'? y rm: cannot remove 'sanqiu.txt': Operation not permitted这说明粘滞位成功阻止了非所有者删除他人文件,保障了共享目录中文件的安全性。
---------------基础命令---------------
------- 用户信息 -------
一、id
id - 英文全称为 “identity”
核心作用:显示指定用户或当前用户的身份信息,包括用户 ID(UID)、组 ID(GID)及所属的所有用户组,用于快速查询用户的权限相关标识
基本用法:
id:显示当前登录用户的身份信息id # 输出当前用户的UID、GID及所属组列表
id [用户名]:显示指定用户的身份信息id zhangsan # 输出zhangsan用户的UID、GID及所属组
常用选项:
-u:仅显示用户的 UID(用户 ID)-g:仅显示用户的主组 GID(初始组 ID)-G:显示用户所属的所有组的 GID(包括主组和附加组)-n:与-u/-g/-G配合使用,显示名称而非 ID(如:用户名、组名)
使用示例:
# 显示当前用户完整信息 id # 输出示例:uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),4(adm),24(cdrom),27(sudo)...# 显示指定用户的完整信息 id lisi # 输出示例:uid=1001(lisi) gid=1001(lisi) groups=1001(lisi),1005(developers)# 仅显示当前用户的UID id -u # 输出:1000# 仅显示指定用户的主组名称 id -gn wangwu # 输出:wangwu(主组名)# 显示当前用户所属的所有组ID id -G # 输出:1000 4 24 27 1005(主组GID+附加组GID)# 显示当前用户所属的所有组名称 id -Gn # 输出:zhangsan adm cdrom sudo developers
注意事项:
- 若指定的用户不存在,
id命令会报错(如:id: ‘invaliduser’: no such user)- 输出中的
uid表示用户 ID,gid表示主组 ID,groups列出所有所属组(主组 + 附加组)- 系统用户(如:root)的 UID 通常为 0,系统组的 GID 通常小于 1000
- 与
groups命令的区别:groups仅显示用户所属的组名称,id可显示更全面的 ID 和名称信息- 在脚本中常用
id -u检查用户是否存在(如:if id "username" &>/dev/null; then ...)

二、passwd
passwd - 英文原意为 “password”
核心作用:修改用户账户的密码,包括当前用户的密码和其他用户的密码(需权限),是系统安全管理的基础命令
基本用法:
passwd:修改当前登录用户的密码(无需指定用户名)passwd # 执行后按提示输入当前密码和新密码
passwd [用户名]:修改指定用户的密码(需 root 权限或 sudo 权限)sudo passwd zhangsan # 修改zhangsan用户的密码
常用选项:
-d:删除用户密码(使账户无密码,可直接登录,有安全风险)-e或--expire:强制用户下次登录时必须修改密码-n [天数]:设置密码最小修改间隔(防止频繁改密码,0 表示无限制)-x [天数]:设置密码有效期(超过天数需修改,99999 表示永不过期)-w [天数]:设置密码过期前的警告天数(提前提醒用户改密码)-S或--status:显示用户密码状态(是否锁定、有效期等)
使用示例:
# 修改当前用户密码 passwd # 输出提示: # Changing password for user 用户名. # Current password: (输入当前密码) # New password: (输入新密码) # Retype new password: (确认新密码)# 管理员修改其他用户密码 sudo passwd lisi # 无需输入旧密码,直接设置新密码# 锁定和解锁用户 sudo passwd -l wangwu # 锁定wangwu账户 sudo passwd -u wangwu # 解锁wangwu账户# 强制用户下次登录改密码 sudo passwd -e zhaoliu # zhaoliu下次登录时必须修改密码# 设置密码有效期 sudo passwd -x 90 -w 10 zhangsan # 密码90天有效期,到期前10天警告# 查看密码状态 sudo passwd -S zhangsan # 输出示例:zhangsan P 08/15/2025 0 90 10 7 # 含义:用户名 密码状态(已设置) 修改日期 最小间隔 最大有效期 警告天数 宽限期
注意事项:
- 普通用户只能修改自己的密码,且需提供当前密码;root 用户可修改任何用户密码,无需旧密码
- 密码设置需符合系统安全策略(通常要求长度≥8 位,包含大小写字母、数字和特殊字符)
- 密码输入时不显示明文,输错需重新输入
- 锁定账户(
-l)仅禁止密码登录,不影响 SSH 密钥登录(需额外处理密钥文件)- 无密码账户(
-d)存在安全风险,除非特殊场景,否则不建议使用- 密码信息存储在
/etc/shadow文件中(加密形式),普通用户无读取权限

------- 身份切换 -------
一、su
su - 英文全称为 “switch user”
核心作用:在不退出当前终端会话的情况下,切换到另一个用户身份(默认切换到 root 用户),获得该用户的权限和操作环境
基本用法:
su:默认切换到 root 用户,需输入 root 密码su # 切换到root用户,验证密码后提示符变为 #
su [用户名]:切换到指定用户,需输入目标用户的密码su developer # 切换到developer用户,输入该用户密码
su - [用户名]:切换到指定用户并加载其完整登录环境(家目录、环境变量等)su - root # 切换到root并加载其登录环境(推荐用法) su - john # 切换到john用户并使用其完整环境
常用选项:
-或--login:切换用户时加载目标用户的登录环境(等同于重新登录该用户,家目录、PATH 等环境变量会切换为目标用户的配置)-c [命令]:切换到目标用户后执行指定命令,执行完毕后返回原用户-s [shell]:指定切换后使用的 shell(需目标用户有权限)
使用示例:
# 基础切换(不加载完整环境) su # 切换到root,保留当前目录和部分环境变量# 推荐切换方式(加载完整环境) su - # 等同于 su - root,切换后进入root家目录,环境变量完全切换# 切换到普通用户 su - mary # 切换到mary用户并加载其登录环境# 执行单条命令后返回 su -c "ls /root" # 以root身份执行ls /root,完成后返回当前用户 su - john -c "pwd" # 以john身份执行pwd,输出john的家目录# 指定shell切换 su -s /bin/zsh root # 切换到root并使用zsh作为shell
注意事项:
- 切换用户后,可通过
exit命令返回原用户身份- 不加
-选项时,虽然切换了用户身份,但家目录、PATH 等环境变量可能仍为原用户的配置,可能导致命令执行异常,建议切换时加-- 许多系统默认禁用 root 直接登录,此时可通过
sudo su -间接切换到 root(使用当前用户密码)- 长期以 root 身份操作存在安全风险,建议仅在必要时切换,完成操作后及时退出
- 普通用户使用 su 切换到其他用户时,需知道目标用户的密码,而 root 用户切换到任何用户无需密码


与 sudo 的区别:
| 特性 | su 命令 | sudo 命令 |
|---|---|---|
| 密码验证 | 需要目标用户的密码 (如:切换到 root 需 root 密码) | 需要当前用户的密码 (需提前在 sudoers 配置权限) |
| 权限范围 | 切换后获得目标用户的全部权限 | 仅执行指定命令时临时获得权限,完成后恢复原权限 |
| 环境变量 | 默认保留原环境 (加 - 则切换为目标用户环境) | 保留当前用户环境 (可通过 -E 选项指定) |
| 安全性 | 需共享目标用户密码,风险较高 | 无需共享 root 密码,权限可精细控制 |
二、sudo
sudo - 英文全称为 “superuser do”
核心作用:允许普通用户以超级用户(root)或其他用户的权限执行指定命令,是 Linux 系统中权限管理的核心工具
基本用法:
sudo [命令]:以 root 权限执行指定命令sudo apt update # 以root权限更新软件包列表
sudo -u [用户名] [命令]:以指定用户的权限执行命令sudo -u www-data touch /var/www/file.txt # 以www-data用户权限创建文件
常用选项:
-i:切换到 root 用户的交互式登录 shell(相当于sudo su -)-s:以 root 权限启动一个 shell(非登录 shell,保留当前目录)-l:列出当前用户可执行的 sudo 命令权限-k:立即失效当前 sudo 的密码缓存(下次使用 sudo 需重新输入密码)-E:保留当前用户的环境变量执行命令
使用示例:
# 基本权限提升 sudo rm /var/log/old.log # 以root权限删除系统日志文件# 切换到root环境 sudo -i # 进入root用户的登录环境,提示符变为 ## 查看可执行的权限 sudo -l # 列出当前用户被允许执行的sudo命令# 以其他用户身份执行 sudo -u mysql mysqldump dbname > backup.sql # 以mysql用户身份备份数据库# 执行需要环境变量的命令 sudo -E echo $PATH # 保留当前用户的PATH变量执行echo
注意事项:
- 使用 sudo 时通常需要输入当前用户的密码(而非 root 密码),密码输入时不显示明文
- 并非所有用户都能使用 sudo,需由root在 /etc/sudoers 文件中配置权限(推荐使用
visudo命令编辑)- 密码验证后有时间缓存(默认 5 分钟),期间再次使用 sudo 无需重复输入密码
- 谨慎使用
sudo rm -rf等高危命令,错误操作可能导致系统损坏- 建议遵循 “最小权限原则”,仅在必要时使用 sudo,完成操作后及时退出 root 环境
------- 用户与组 -------
一、useradd
useradd - 英文全称为 “user add”
核心作用:在 Linux 系统中创建新的用户账户,是用户管理的基础命令,通常需要 root 权限执行
基本用法:
useradd [用户名]:创建默认创建基本的用户账户(使用系统默认配置)sudo useradd zhangsan # 创建名为zhangsan的用户
useradd [选项] [用户名]:自定义用户属性创建账户sudo useradd -m -s /bin/bash lisi # 创建lisi用户,自动创建家目录并指定bash为默认shell
常用选项:
-m或--create-home:自动创建用户的家目录(默认路径为/home/用户名)-s或--shell:指定用户的默认登录 shell(如:/bin/bash、/bin/zsh,默认通常为/bin/sh)-g或--gid:指定用户的初始所属组(需为已存在的组 ID 或组名)-G或--groups:指定用户的附加组(多个组用逗号分隔)-d或--home-dir:指定用户的家目录(自定义路径,而非默认的/home/用户名)-u或--uid:指定用户的 UID(用户 ID,需为未被占用的数字)-e或--expiredate:设置账户过期日期(格式为YYYY-MM-DD)-c或--comment:添加用户注释信息(如:用户全名、联系方式等)
使用示例:
# 创建基本用户(无家目录,默认shell) sudo useradd wangwu# 创建带家目录和bash shell的用户 sudo useradd -m -s /bin/bash zhaoliu# 指定所属组和附加组 sudo useradd -g developers -G sudo,adm qianqi # 主组为developers,附加组为sudo和adm# 自定义家目录和UID sudo useradd -u 1050 -d /opt/user/zhang san # UID为1050,家目录为/opt/user/zhang# 添加注释信息并设置过期日期 sudo useradd -c "Zhang San, Dev Team" -e 2025-12-31 zhangsan
注意事项:
useradd命令默认不会设置用户密码,创建后需用passwd命令设置密码(如:sudo passwd zhangsan)- 不同 Linux 发行版的默认配置可能不同(如:是否自动创建家目录),可通过
/etc/default/useradd文件查看或修改默认值- 创建用户后,相关信息会存储在
/etc/passwd(用户基本信息)、/etc/shadow(密码哈希)、/etc/group(组信息)等文件中- 删除用户需使用
userdel命令,若需同时删除家目录可加-r选项(sudo userdel -r 用户名)
创建用户后,建议立即设置密码并检查用户信息:
sudo passwd 用户名 # 设置密码 id 用户名 # 查看用户UID、GID等信息 finger 用户名 # 查看用户详细信息(需安装finger工具)

二、usermod
usermod - 英文全称为 “user modify”
核心作用:修改已存在用户的账户属性,包括用户名、家目录、所属组、默认 shell 等,是 Linux 系统中用户管理的重要命令
基本用法:
usermod [选项] [用户名]:修改指定用户的属性sudo usermod -s /bin/zsh lisi # 修改lisi用户的默认shell为zsh
常用选项:
-s或--shell:修改用户的默认登录 shell(如:/bin/bash、/bin/zsh)-d或--home:修改用户的家目录路径(需配合-m选项移动现有文件)-m或--move-home:与-d配合使用,将原家目录文件移动到新目录-g或--gid:修改用户的初始所属组(主组)-G或--groups:修改用户的附加组(覆盖原有附加组,多个组用逗号分隔)-a或--append:与-G配合使用,向附加组中添加新组(不覆盖原有组)-l或--login:修改用户名(需确保用户未登录)-u或--uid:修改用户的 UID(需为未被占用的数字,且需手动调整文件权限)-e或--expiredate:修改账户过期日期(格式为YYYY-MM-DD,-1表示永不过期)-L或--lock:锁定用户账户(禁止登录)-U或--unlock:解锁用户账户
使用示例:
# 修改用户默认shell sudo usermod -s /bin/bash wangwu # 将wangwu的shell改为bash# 修改家目录并移动文件 sudo usermod -d /home/new_wangwu -m wangwu # 将wangwu的家目录迁至新路径并移动文件# 覆盖附加组(原有附加组会被清除) sudo usermod -G sudo,dev wangwu # 设置wangwu的附加组为sudo和dev# 追加附加组(保留原有附加组) sudo usermod -aG docker wangwu # 向wangwu的附加组中添加docker组# 修改用户名 sudo usermod -l zhangsan_new zhangsan_old # 将zhangsan_old改名为zhangsan_new# 锁定和解锁账户 sudo usermod -L zhangsan # 锁定zhangsan账户 sudo usermod -U zhangsan # 解锁zhangsan账户# 设置账户过期日期 sudo usermod -e 2026-01-01 lisi # 设置lisi账户在2026年1月1日过期
注意事项:
- 执行
usermod需 root 权限(或 sudo 权限)- 修改正在登录的用户属性可能导致异常,建议修改前确保用户已退出登录
- 修改 UID 后,需手动更新该用户所有文件的所有者权限(可使用
chown -R 新UID:新GID 目录)- 用户名修改后,家目录名称不会自动同步,需手动修改并配合
-d选项更新配置- 锁定账户仅禁止密码登录,不影响 SSH 密钥登录(需额外处理密钥文件)
- 可用
id 用户名或grep 用户名 /etc/passwd验证修改结果

三、userdel
userdel - 英文全称为 “user delete”(删除用户)
核心作用:从系统中删除指定的用户账户,包括用户的相关配置信息,是用户管理的重要命令
基本用法:
userdel [用户名]:删除指定用户账户(默认保留用户家目录和邮件目录)sudo userdel zhangsan # 删除zhangsan用户,保留其家目录
userdel [选项] [用户名]:带选项删除用户,可自定义删除行为sudo userdel -r lisi # 删除lisi用户并同时删除其家目录
常用选项:
-r或--remove:删除用户的同时,删除其家目录(/home/用户名)和邮件目录(/var/spool/mail/用户名)-f或--force:强制删除用户,即使用户当前处于登录状态(不推荐,可能导致文件残留)
使用示例:
# 基本删除(保留家目录) sudo userdel wangwu # 删除wangwu用户,家目录仍保留在/home/wangwu# 彻底删除(包括家目录) sudo userdel -r zhaoliu # 删除zhaoliu用户及对应的家目录和邮件文件# 强制删除(谨慎使用) sudo userdel -f qianqi # 即使qianqi正在登录,也强制删除该用户# 结合组删除(若用户是私有组的唯一成员) sudo userdel -r sunba # 若sunba的私有组无其他成员,组会被自动删除
注意事项:
- 执行
userdel需 root 权限(或 sudo 权限)- 建议删除用户前确保该用户未登录系统(可通过
who或w命令查看登录用户),避免使用-f强制删除- 若用户是某些文件的所有者,删除用户后这些文件的所有者会变为 UID(数字形式),需提前处理(用
chown转移所有权)- 用户的附加组不会被自动删除,需手动用
groupdel命令删除(若组已无其他成员)- 删除用户后,相关记录会从
/etc/passwd、/etc/shadow、/etc/group等文件中移除
删除用户前的建议操作:
# 1. 确认用户是否登录 who | grep 用户名# 2. 查找用户拥有的文件(除家目录外) find / -user 用户名 2>/dev/null# 3. 转移或备份重要文件 # 4. 再执行删除命令

四、groupadd
groupadd - 英文全称为 “group add”
核心作用:在 Linux 系统中创建新的用户组,用于集中管理用户权限,实现多用户协作访问资源
基本用法:
groupadd [组名]:创建默认配置的用户组(系统自动分配 GID)sudo groupadd developers # 创建名为developers的用户组
groupadd [选项] [组名]:自定义组属性创建用户组sudo groupadd -g 1005 design # 创建GID为1005的design组
常用选项:
-g或--gid:指定组的 GID(组 ID,需为未被占用的数字,默认从 1000 开始递增)-r或--system:创建系统组(GID 在系统组范围内,通常小于 1000,用于系统服务)
使用示例:
# 创建普通用户组 sudo groupadd marketing # 创建marketing组,GID自动分配# 创建指定GID的组 sudo groupadd -g 2000 sales # 创建sales组,指定GID为2000# 创建系统组(用于服务账户) sudo groupadd -r nginx # 创建系统组nginx,GID在系统范围内
注意事项:
- 执行
groupadd需 root 权限(或 sudo 权限)- GID 需在系统允许范围内(普通组 GID 默认≥1000,系统组 GID 默认 < 1000,具体范围由
/etc/login.defs定义)- 创建组后,信息会存储在
/etc/group(组基本信息)和/etc/gshadow(组密码信息,极少使用)文件中- 可通过
grep 组名 /etc/group验证组是否创建成功(如:grep developers /etc/group)- 删除组需使用
groupdel命令(sudo groupdel 组名),删除前需确保组中无用户(主组)

五、groupmod
groupmod - 英文全称为 “group modify”
核心作用:修改已存在用户组的属性,包括组名、GID(组 ID)等,用于调整用户组的配置信息
基本用法:
groupmod [选项] [组名]:修改指定用户组的属性sudo groupmod -n devs developers # 将developers组改名为devs
常用选项:
-n或--new-name:修改组名(新组名需唯一)-g或--gid:修改组的 GID(组 ID,需为未被占用的数字)
使用示例:
# 修改组名 sudo groupmod -n group_new group_old # 将group_old组改名为group_new# 修改GID sudo groupmod -g 1010 marketing # 将marketing组的GID改为1010
注意事项:
- 执行
groupmod需 root 权限(或 sudo 权限)- 修改 GID 后,所有属于该组的 文件/目录 的组权限会保留旧 GID,需手动用
chgrp -R 新GID 路径同步(例如:sudo chgrp -R 1010 /home/marketing)- 若组是某些用户的主组,修改 GID 后需确保这些用户的配置同步(
/etc/passwd中会自动更新)- 组名修改后,相关用户的附加组配置会自动关联新组名,无需额外修改用户
- 无法修改系统内置组(如:root、bin 等)的关键属性,避免系统异常
- 可用
grep 组名 /etc/group验证修改结果(如:grep engineering /etc/group)

六、groupdel
groupdel - 英文全称为 “group delete”
核心作用:在 Linux 系统中删除已存在的用户组,清理不再需要的组配置,释放组资源(如 GID)
基本用法:
groupdel [组名]:删除指定的用户组(无多余选项时,直接删除符合条件的组)sudo groupdel old_project # 删除名为old_project的用户组
关键限制与前置条件:
groupdel 命令无复杂选项,但删除组前必须满足以下条件,否则会执行失败:
不能删除用户的主组:若某用户的主组是待删除组,需先将该用户的主组修改为其他组(用usermod -g 新主组 用户名),或删除该用户(用userdel 用户名)
- 示例:若
zhangsan的主组是old_project,需先执行sudo usermod -g users zhangsan,再删除old_project组。不能删除系统内置关键组:如
root(GID=0)、bin(GID=1)、sys(GID=3)等系统核心组,删除会导致系统权限紊乱甚至崩溃,系统会直接拒绝此类操作组必须已存在:若指定的组名不存在(未通过
groupadd创建),会提示 “groupdel: group ‘xxx’ does not exist”
使用示例:
# 1. 常规删除(确保组不是任何用户的主组) sudo groupdel test_group # 删除名为test_group的普通组# 2. 处理“组是主组”的情况(先修改用户主组,再删组) # 步骤1:查看哪些用户的主组是待删除组(如developers) grep ":$(grep developers /etc/group | cut -d: -f3):" /etc/passwd | cut -d: -f1 # 步骤2:将这些用户的主组改为其他组(如users) sudo usermod lisi -g users # 假设lisi的主组是developers # 步骤3:删除组 sudo groupdel developers# 3. 验证删除结果(查看/etc/group确认组已不存在) grep test_group /etc/group # 无输出则表示组已成功删除

------- 权限管理 -------
一、chmod
chmod - 英文全称为 “change mode”
核心作用:修改文件或目录的访问权限,控制用户(所有者、所属组、其他用户)对文件的读、写、执行权限
基本用法:
chmod [权限设置] [文件/目录]:修改指定文件或目录的权限chmod u+x document.txt # 用符号方式为文件所有者添加执行权限 chmod 755 script.sh # 用数字方式设置 script.sh 的权限
chmod -R [权限设置] [目录]:递归修改目录及其所有 子文件/子目录 的权限chmod -R 770 docs/ # 递归修改 docs 目录及内容的权限
权限表示方法:
1. 符号表示法
通过符号组合设置权限,格式:
[用户类别][操作符][权限]
- 用户类别:
u(所有者)、g(所属组用户)、o(其他用户)、a(所有用户,默认)- 操作符:
+(添加权限)、-(移除权限)、=(设置为指定权限)- 权限:
r(读)、w(写)、x(执行)示例:
u+x:给所有者添加执行权限g-rw:移除组用户的读和写权限o=rx:设置其他用户仅有读和执行权限a-w:所有用户都移除写权限2. 数字表示法(常用)
用 3 位数字表示权限,每位数字对应一类用户的权限:
- 第 1 位:文件所有者(u = user)
- 第 2 位:所属组用户(g = group)
- 第 3 位:其他用户(o = others)
权限对应数字:
- 读(r):4
- 写(w):2
- 执行(x):1
- 无权限:0
示例:
755:所有者可读 + 写 + 执行(4+2+1=7),组用户和其他用户可读 + 执行(4+1=5)644:所有者可读 + 写(4+2=6),组用户和其他用户仅可读(4)777:所有用户都有读 + 写 + 执行权限(最高权限,谨慎使用)
使用示例:
# 符号方式设置权限 chmod u+x run.sh # 给脚本添加所有者执行权限(使其可直接运行) chmod g+w data/ # 给组用户添加目录写入权限 chmod o-r log.txt # 禁止其他用户读取日志文件# 数字方式设置权限 chmod 600 private.txt # 仅所有者可读写,其他用户无权限(适合敏感文件) chmod 755 app/ # 目录所有者可读写执行,其他用户可读执行(标准目录权限)# 递归修改目录权限 chmod -R g=rwx docs/ # 递归设置组用户对 docs 目录及内容的权限(X 对目录加执行权,文件不加)# 批量修改同类型文件 chmod 644 *.txt # 所有 .txt 文件设置为所有者读写,其他用户只读
注意事项:
- 目录必须有执行权限(x) 才能被进入(cd),文件的执行权限通常用于脚本或程序
- 修改权限需满足:要么是文件所有者,要么是 root 用户(或有 sudo 权限)
- 递归修改(
-R)需谨慎,尤其对系统目录,错误设置可能导致系统异常777权限允许所有用户操作,存在安全风险,除非临时测试,否则不建议使用- 可用
ls -l命令查看文件当前权限(如:-rwxr-xr-x对应数字权限 755)


二、chown
chown - 英文全称为 “change owner”
核心作用:修改文件或目录的所有者(用户)和所属组(用户组),用于调整文件的归属权关系
基本用法:
chown [新所有者] [文件/目录]:仅修改文件或目录的所有者chown alice file.txt # 将 file.txt 的所有者改为 alice
chown [新所有者]:[新所属组] [文件/目录]:同时修改所有者和所属组chown bob:devs project/ # 将 project 目录的所有者改为 bob,所属组改为 devs
chown -R [新所有者]:[新所属组] [目录]:递归修改目录及其所有子内容的所有者和所属组chown -R www-data:www-data /var/www/ # 递归修改网站目录的归属
常用选项:
-R或--recursive:递归处理目录下的所有文件和子目录
语法格式:
语法格式变体:
chown 用户名 目标:仅改所有者chown :组名 目标:仅改所属组(注意冒号前为空)chown 用户名:组名 目标:同时改所有者和所属组chown 用户名.组名 目标:用点(.)分隔所有者和组(与冒号功能相同,注意避免用户名包含点的情况)
使用示例:
# 仅修改所有者 chown john report.pdf # 将 report.pdf 的所有者改为 john# 仅修改所属组 chown :staff docs/ # 将 docs 目录的所属组改为 staff# 同时修改所有者和所属组 chown mary:team1 data.csv # 所有者改为 mary,所属组改为 team1# 递归修改目录及其内容 chown -R admin:operators /opt/app/ # 递归修改 app 目录下所有内容的归属# 结合 sudo 使用(普通用户需权限) sudo chown root:root /etc/hosts # 将 hosts 文件的归属改回 root
注意事项:
- 只有 root 用户或拥有 sudo 权限的用户才能修改文件的所有者(
普通用户只能修改自己拥有的文件的所属组,且新组必须是该用户所属的组)- 修改归属权会影响文件的访问权限(结合 chmod 命令共同管理文件权限)
- 递归修改(
-R)时需特别谨慎,尤其是对系统目录,错误操作可能导致权限混乱- 用户名和组名必须是系统中已存在的(可通过
/etc/passwd查看用户,/etc/group查看组)- 可用
ls -l命令查看文件当前的所有者和所属组(如:-rw-r--r-- 1 alice staff ...表示所有者为 alice,所属组为 staff)

三、chgrp
chgrp - 英文全称为 “change group”
核心作用:专门修改文件或目录的所属用户组,用于调整文件在用户组层面的权限归属
基本用法:
chgrp [新所属组] [文件/目录]:修改指定文件或目录的所属组chgrp devs code.py # 将 code.py 的所属组改为 devs
chgrp -R [新所属组] [目录]:递归修改目录及其所有 子文件/子目录 的所属组chgrp -R sales reports/ # 递归将 reports 目录及内容的所属组改为 sales
常用选项:
-R或--recursive:递归处理目录下的所有文件和子目录-v:显示修改过程的详细信息(verbose 模式)
使用示例:
# 基本修改所属组 chgrp admins config.ini # 将配置文件的所属组改为 admins# 递归修改目录所属组 chgrp -R marketing docs/ # 递归修改 docs 目录及所有子内容的所属组为 marketing# 显示修改过程 chgrp -v developers *.sh # 批量修改所有 .sh 脚本的所属组为 developers,并显示修改信息# 结合 sudo 使用(修改系统文件时) sudo chgrp wheel /usr/local/bin/tool # 将工具的所属组改为 wheel 组(通常包含管理员用户)
注意事项:
- 普通用户修改所属组时,新组必须是该用户已加入的组(可通过
groups命令查看用户所属组)- 只有 root 用户或拥有 sudo 权限的用户可以将文件所属组修改为任意组
- 与 chown : 组名 功能相同(chown 可同时修改所有者和组,chgrp 仅专注于修改组)
- 所属组的修改会影响组权限的生效(需配合
chmod命令设置组级别的 读/写/执行 权限)- 可用
ls -l命令查看文件当前的所属组(如:-rw-r--r-- 1 alice devs ...中devs即为所属组)

四、umask
umask - 英文全称为 “user file-creation mode mask”
核心作用:设置新创建文件或目录的默认权限掩码,通过从最大默认权限中减去掩码值,控制 新文件/目录 的初始访问权限
权限基础:
Linux 为新创建的文件和目录预设了 “最大默认权限”,umask 在此基础上进行权限缩减:
- 新文件:最大默认权限为
666(-rw-rw-rw-,无执行权限,避免安全风险)- 新目录:最大默认权限为
777(drwxrwxrwx,目录需要执行权限才能进入)最终权限计算公式:实际权限 = 最大默认权限 & (~umask 掩码值)
基本用法:
umask:查看当前的权限掩码(默认以八进制数字显示)umask # 示例输出:0022(最前面的0为特殊权限位,通常忽略)
umask [掩码值]:临时设置新的权限掩码(仅对当前终端会话有效)umask 0002 # 将掩码设置为0002
权限计算:
掩码
0022(默认)
新文件:
666 - 022 = 644(-rw-r--r--)新目录:
777 - 022 = 755(drwxr-xr-x)掩码
0077(严格权限,仅所有者可访问)
新文件:
666 - 077 = 600(-rw-------)新目录:
777 - 077 = 700(drwx------)掩码
0002(宽松组权限)
新文件:
666 - 002 = 664(-rw-rw-r--)新目录:
777 - 002 = 775(drwxrwxr-x)
常用场景:
# 1. 临时设置掩码,创建私密文件 umask 077 touch secret.txt # 权限为 -rw------- mkdir private_dir # 权限为 drwx------# 2. 恢复默认掩码 umask 0022# 3. 为团队协作设置组权限 umask 0002 touch project_notes.txt # 权限为 -rw-rw-r-- mkdir team_docs # 权限为 drwxrwxr-x# 4. 永久生效(添加到配置文件) echo "umask 0022" >> ~/.bashrc # 仅对当前用户生效 source ~/.bashrc # 立即生效
注意事项:
- umask 仅影响新创建的文件 / 目录,对已存在的文件无作用(需用 chmod 修改)
- 掩码值为 3-4 位八进制数,常见默认值:
- 普通用户:
0002或0022- root 用户:
0022或0077(系统文件更严格)- 永久修改需写入配置文件(
~/.bashrc个人用户,/etc/profile全局用户)- 计算权限时是按位 “与非” 运算,而非简单减法(例如:666 - 022 实际是 666 & ~022)

------- 文件属性 -------
一、file
file
核心作用:识别文件的类型(内容格式),通过分析文件头部信息判断其实际类型,而非仅依赖文件名后缀
基本用法:
file [文件名/路径]:判断指定文件的类型file document.txt # 判断 document.txt 的实际类型 file /usr/bin/ls # 判断 ls 命令的文件类型
file [选项] [文件1] [文件2] ...:批量判断多个文件的类型file *.jpg *.sh # 同时判断所有 .jpg 和 .sh 文件的类型
常用选项:
-b:仅显示文件类型描述,不包含文件名(简洁输出)-i:输出 MIME 类型(如:text/plain、image/jpeg)
使用示例:
# 基本判断(区分真实类型与文件名后缀) file image.png # 即使文件名为 .png,若实际是 JPEG 格式,会显示:image.png: JPEG image data file script.txt # 若实际是可执行脚本,会显示:script.txt: Bourne-Again shell script, ASCII text executable# 简洁输出(仅类型) file -b data.csv # 输出:ASCII text# 查看 MIME 类型 file -i music.mp3 # 输出:music.mp3: audio/mpeg; charset=binary
注意事项:
file命令通过分析文件头部的 “魔术数字”(magic number)判断类型,比依赖文件名后缀更可靠(例如:伪装成.txt的病毒文件可被识别为二进制程序)- 对于空文件,
file会显示为empty- 对于目录,
file会直接显示为directory- 部分特殊格式文件可能需要更新系统的 “魔术数据库”(
/etc/magic或/usr/share/magic)才能正确识别,可通过sudo update-magic更新(部分系统支持)- 在处理设备文件(如:
/dev/sda)时,file会显示设备类型信息



