文章目录
前言
本篇文章将讲解Linux基础命令中与用户管理相关的命令,包括su、useradd、passwd、sudo、usermod、userdel、groupadd、chage
等命令,从底层出发带领大家理解Linux系统运行命令的本质,全文超20000
字,通过各种实操案例,帮助大家轻松学会这些命令,并实现举一反三。
1、切换用户(su)
标准方式:
su - 用户名
,如:su - root
一般方式:su 用户名
,如:su root
Tips
:
当不指定用户名时,默认切换为root用户,如:su 或 su - ;从普通用户切换至其它用户必须输入密码,而从root用户切换至普通用户则不需要输入密码
案例演示:
注意:
我们在切换用户时一般采用标准方式,它会将用户的权限
和环境变量
一起切换,而一般方式只会切换用户权限
,而不会切换环境变量
扩展:环境变量
Linux
环境变量
是系统级的动态键值对,用于定义程序运行环境。它们存储配置信息,如路径、用户偏好或应用参数,供进程在运行时调用。例如,PATH变量指定可执行文件的搜索目录,LANG决定系统语言,HOME指向用户主目录。用户可通过终端临时设置(如export VAR=value)或写入配置文件(如~/.bashrc)永久生效。环境变量具有继承性,父进程设置的变量会被子进程继承,常用于区分开发/生产环境(如NODE_ENV)。全局变量(/etc/environment)影响所有用户,局部变量仅限当前会话。
在Linux系统中,若使用su
命令切换用户时未加-
参数(如su user
而非su - user
),仅切换用户权限而未加载目标用户的环境变量(如PATH
、HOME
等),会导致以下问题:
- 路径与命令失效:因
PATH
未更新,可能无法访问目标用户的专属命令或脚本; - 配置文件未加载:如
.bashrc
、.profile
中的自定义变量或别名不生效,影响程序运行; - 权限冲突:临时文件或日志可能误写入原用户目录,导致权限错误;
- 安全风险:敏感环境变量未重置,可能泄露原用户配置或暴露不安全路径。
此类问题常见于脚本或服务调用时,推荐使用su -
或sudo -i
以完整切换用户环境。
2、登出用户(exit)
命令:
exit
(快捷键:ctrl+d
,不区分大小写)
一般用于切换用户后,回退至上一级用户,若多次登陆用户,执行exit
会依次登出,当回退至最初的用户时,再次输出exit
,会直接关闭终端
,返回桌面
案例演示:
注意:
我们在切换其它用户后,若想返回至上一级用户一般都会使用exit
,虽然也可以通过su
命令切换回去,但在Linux中使用su
命令切换用户并不是返回至上一级用户,而是为该用户开辟一个新的环境变量
,相当于不断地嵌套,这样就会不停地消耗资源,包括我们在关闭终端
时最好也是用exit
进行注销,而不是点击右上角的X
号,这样可以完全关闭终端
,避免资源消耗
Linux切换用户示意图:
3、创建用户(useradd)
3.1 基本语法
语法:
useradd [选项] 用户名
useradd是Linux系统中用于创建新用户账户的基本命令。
常用选项
选项 | 描述 |
---|---|
-c “注释” | 添加用户备注信息 |
-d 目录 | 指定用户主目录 |
-e 日期 | 设置账户过期日期(YYYY-MM-DD) |
-f 天数 | 密码过期后多少天关闭账户 |
-g 组名 | 指定主用户组 |
-G 组列表 | 指定附加组(多个组用逗号分隔) |
-m | 创建用户主目录(通常与-d一起使用) |
-M | 不创建用户主目录 |
-p 密码 | 设置加密后的密码(不推荐直接使用) |
-s shell | 指定用户登录shell |
-u UID | 指定用户ID |
-k | 模板目录 指定骨架目录(默认/etc/skel) |
-r | 创建系统账户(无主目录),UID通常小于1000 |
3.2 常用方法
-
创建普通用户:
useradd -m username # 这里 -m 选项可省略,默认会在 /home 下创建一个与用户名相同的家目录
这会创建用户并自动创建
/home/username
目录 -
创建用户并指定主目录:
useradd -m -d /path/to/home username
这里会创建用户
username
,其家目录为/path/to/home
,若指定目录不存在,会自动创建 -
创建用户并指定用户组:
useradd -g primarygroup -G supplementarygroup1,supplementarygroup2 username
这里会创建用户,
-g
表示创建主用户组,并将该用户加入到改组中,若省略-g
选项,系统会默认创建一个与用户名相同的主用户组;-G
表示创建附加组,并将用户加入到这些组中,用户只能加入一个主用户组,但可以加入多个附加组 -
创建系统账户:
useradd -r systemuser
这里会创建一个UID小于1000的用户
systemuser
-
创建用户并指定shell:
useradd -s /bin/bash username
这里会创建用户并指定shell为
/bin/bash
-
创建用户并设置过期日期:
useradd -e 2025-12-31 username # 用户过期后便无法登陆
-
创建用户并设置密码:
useradd -p 12345678 username # 一般我们都是通过passwd命令设置密码,不会直接在创建用户时设置
-
查看默认设置
useradd -D
这个命令会显示useradd的默认配置,如主目录位置、默认shell、账户过期时间等,如:
3.3 创建用户后的常见操作
-
设置密码:
passwd username
系统默认要求用户必须设置密码才能登陆,若没有设置密码,普通用户下无法切换至目标用户,root用户除外。
-
删除用户(使用userdel命令):
userdel username # 只删除用户 userdel -r username # -r 选项表示删除用户及其家目录,一般使用改命令删除用户,以保证完全删除用户数据
-
查看用户信息(使用id命令)
id # 显示当前用户信息 id username # 显示指定用户信息
示例:
3.4 注意事项
-
通常需要
root
权限(或使用sudo
)来执行useradd
命令,sudo
表示以管理员权限执行该命令 -
默认情况下,
useradd
会创建主目录(配置文件中已经默认设置好了),可以省略-m
选项 -
用户创建后,建议立即设置密码,系统默认要求用户必须设置密码才能登陆,当然root用户除外。
-
不同的Linux发行版可能有不同的默认配置(如主目录位置、默认shell等)
-
每个用户都必须加入一个用户组(私有组、主组、属组),一般创建用户时,不指认用户组,系统会默认创建以用户名命名的组;每个用户都可以加入多个组(属组)
-
创建用户时,会默认给用户创建一个家目录作为用户的主目录,包括桌面及相关用户数据会默认存放在家目录中,其它用户一般没有权限访问他人的家目录
4、管理用户密码(passwd)
在Linux中,passwd命令用于管理用户密码,功能包括修改密码、锁定账户、设置密码策略等。
1、基本用法
-
修改当前用户密码
普通用户直接运行passwd
,按提示输入旧密码和新密码:passwd
-
管理员修改其他用户密码
普通用户想要修改其它用户的密码,需要在命令前加上sudo
passwd username
2、账户锁定与解锁
-
锁定用户账户
用户无法通过密码登录(不影响其他登录方式如SSH密钥):passwd -l username # 或 --lock
-
解锁用户账户
passwd -u username # 或 --unlock
3、密码管理
-
删除用户密码
使该用户无需密码就可以直接登陆:passwd -d username # 或 --delete
-
强制用户下次登录修改密码
passwd -e username # 或 --expire
4、查看密码状态
-
显示密码信息
passwd -S username # 或 --status
示例输出:
lisi PS 2025-04-28 0 99999 7 -1
依次为:用户密码已设置、最后修改日期、最短有效期、最长有效期、警告期等
5、密码有效期设置
-
设置密码最短有效期(7天内不可修改)
passwd -n 7 username # 或 --mindays
-
设置密码最长有效期(30天后过期)
passwd -x 30 username # 或 --maxdays
6、非交互式修改密码(脚本适用)
-
方法1:通过管道设置密码(部分系统支持–stdin)
echo "new_password" | sudo passwd --stdin username # root用户可以不使用sudo
new_password:表示你要设置的新密码
username:表示要设置的用户 -
方法2:使用chpasswd命令(更通用)
echo "username:new_password" | sudo chpasswd # root用户可以不使用sudo
username:表示要设置的用户
new_password:表示你要设置的新密码
注意:
- 普通用户没有权限修改他人的密码,修改自己的密码需要输入原密码,并且要符合密码难度策略
- 管理员可修改任何用户的密码,且不用输入原密码,不用遵守密码难度策略
总结:
通过 man passwd
命令可查看完整文档。注意权限管理,避免安全风险。
5、重要文件目录
5.1 用户账号文件(/etc/passwd)
/etc/passwd
文件用来存放和配置用户相关信息
1、文件内容格式及含义
-
文件中每一行都是一个账户的基本信息,分别由7个字段组成,每个字段用
:
进行隔开,格式如下:
字段1
:用户名称
字段2
:密码占位符"x",密码的明文信息不回直接在这里显示,通过"x"来表示密码
字段3
:用户帐号的UID号,在系统中的唯一身份,相当于身份证号
字段4
:用户的私有组ID
字段5
:用户描述信息,若没有描述信息,则这里为空
字段6
:用户的主目录
字段7
:登录Shell解释器信息,默认为/bin/bash
,用于解释用户与系统之间的命令交互 -
示例:我们通过命令:
cat /etc/passwd
打印出文件内容,如下:
这里只展示了文件最后几行内容,可以看到最后一行就是我们创建的用户lisi
的账户信息
2、文件的作用
从上面我们了解到了
/etc/passwd
文件的内容格式,以及各字段的含义。那么这个文件到底起什么作用,文件中的内容又是如何生成的呢?我们接着往下看:
-
我们知道linux系统一切皆文件,而
/etc/passwd
文件是用于保存用户账号信息的,由此我们可以知道每当通过useradd
命令创建新的用户时,系统就会在/etc/passwd
末尾以指定格式追加一行该用户的账户信息,这样用户才算创建了一个新的用户 -
当我们不使用命令,而是直接进入
/etc/passwd
文件中修改账户信息时,那么该账户的信息就会被永久修改。例如:我们将/etc/passwd
文件中的用户名lisi
修改为zhangsan
,那么系统中就会出现zhangsan
这个用户,而lisi
则会删除,新用户zhangsan
则会继承lisi
的所有身份信息,包括UID、家目录等,因为我们只是修改了用户名
5.2 用户组文件(/etc/group)
/etc/group
文件用于保存组的基本信息,便于管理相同权限的用户
1、文件内容格式及含义
-
文件中每一行都代表着一个组的基本信息,分别由4个字段组成,每个字段用
:
隔开,如下:
字段1
:组的名称
字段2
:密码占位符“x",组也可以进行登录
字段3
:组的ID号,与用户的UID号相同,两者不冲突
字段4
:组内的附属成员,表示该组是user1,user2和user3的附加组 -
示例:我们通过命令:
cat /etc/group
查看文件内容,如下:
这里展示文件最后几行信息,可以看到名称为lisi
的组,它是在创建用户lisi
时默认创建的组
2、 文件的作用
该文件用于保存组的基本信息,可以通过修改该文件来修改组的相关信息,如:组名、uid、组内成员
组的相关注意事项:
- 用户必须属于一个组
- 每一个组被分配一个独特的组ID(gid)
- gid信息保存在
/etc/group
中 - 每一个用户都有自己的私有组
- 可以将用户添加到别的组,该组称为用户的附加组
- 同一个组中的所有用户能共享属于这个组的文件
5.3 用户密码文件(/etc/shadow)
在Linux系统中,
/etc/shadow
是一个关键的安全文件,用于存储用户的加密密码及相关密码策略信息。它的存在是为了弥补传统/etc/passwd
文件的不足(密码以明文或弱加密形式存储),通过更严格的权限控制提升系统安全性。
1、文件内容格式及含义
-
文件中每一行都代表着一个用户密码的相关信息,由9个字段组成,每个字段用
:
分隔,格式如下:username:encryptedpassword:lastchange:minage:maxage:warning:inactive:expire:reserved
字段1
: 用户名
字段2
: 加密密码(! 或 * 表示账户被锁定)
字段3
: 上次修改密码的天数(从1970-1-1起算)
字段4
: 密码最短使用天数(0表示可随时修改)
字段5
: 密码最长有效期(99999表示永不过期)
字段6
: 密码过期前警告天数
字段7
: 密码过期后账户宽限期
字段8
: 账户绝对过期日期(YYYY-MM-DD)
字段9
: 保留字段 -
示例:我们通过命令:
cat /etc/shadow
查看文件内容,如下:
这里只展示了文件最后几行内容,可以看到最后一行就是用户lisi
密码信息
2、文件的作用及注意事项
- 存储加密密码
- 用户密码通过哈希算法(如SHA-512、bcrypt等)加密后存储,无法直接逆向破解。
- 示例:
其中lisi:$6$BGjQ2NVbr7$dP.Q6aCxTu7q9zxhYcTCUJL/SbK341HYXQipgAW6RIUlHCYMK5eG2AFin/8LNCduru8gKNazfLUYBt.al3mjB
$6$
表示使用SHA-512
加密,BGjQ2NVbr7$dP
是随机盐值,后面的内容则为加密后的密码。
- 不要手动编辑文件
- 直接修改可能导致账户无法登录,建议使用
passwd、chage
等工具。
- 直接修改可能导致账户无法登录,建议使用
/etc/shadow
与/etc/passwd
的关系-
/etc/passwd 存储用户基本信息(UID、GID、Shell等),但密码字段为 x(实际密码在 /etc/shadow 中)。
-
这种分离设计遵循了最小权限原则,减少密码泄露风险。
-
通过合理管理 /etc/shadow
,可以有效提升系统的账户安全性。
6、其它相关命令介绍及使用
6.1 临时获取管理员权限(sudo)
sudo(Super User DO)
是Linux系统中一个非常重要的命令,它允许普通用户以超级用户(root)或其他用户的身份执行命令。
1、配置用户权限(sudoers文件)
普通用户想要使用
sudo
命令,需要先对/etc/sudoers
文件进行一些配置
- 编辑sudoers文件
在root用户下使用 visudo 命令打开sudoers文件(安全且会检查语法):visudo
- 常见配置规则(在sudoers文件末尾加入下面语句)
- 允许用户执行所有命令:
username ALL=(ALL:ALL) ALL
- 允许用户免密执行特定命令:
username ALL=(ALL) NOPASSWD: /usr/bin/apt
username
:用户名
/usr/bin/apt
:允许用户使用apt
命令,linux中的命令本质上也是一个文件,平时我们使用的命令其实是通过硬/软链接指向/usr/bin
目录下的命令文件,因此这里需要输入命令文件的完整路径 - 允许用户组使用sudo(如sudo组或wheel组),系统默认配置,不需要修改:
%sudo ALL=(ALL:ALL) ALL # Ubuntu默认配置 %wheel ALL=(ALL) ALL # CentOS/RHEL默认配置
- 允许用户执行所有命令:
示例: 在/etc/sudoers
文件末尾添加下面语句,允许lisi
用户可以执行所有命令
2、基本用法
在上面我们为指定用户配置好
/etc/sudoers
文件后,该用户就可以使用sudo
命令了
-
执行单条命令
在命令前加sudo,输入当前用户的密码(非root密码)即可临时获得root权限:sudo useradd username # 使用root权限创建用户
-
以其他用户身份执行命令
使用-u
选项指定用户:sudo -u username ls # 以username的身份执行命令 ls
-
常用选项:
选项 说明 -s 启动root的shell环境(保留当前用户环境变量) -i 模拟root登录(加载root的环境变量和配置文件) -l 列出当前用户可执行的命令列表 -k 重置密码缓存(下次使用需重新输入密码) !! 快捷方式:用sudo重新执行上一条命令 示例:
sudo -i # 切换到root用户(需密码) sudo !! # 用sudo执行上一条命令
3、高级技巧
- 环境变量保留
默认情况下,sudo会重置环境变量。使用 -E 保留当前用户环境:sudo -E command # command:表示要执行的命令
- 修改密码缓存时间
在/etc/sudoers
文件中设置timestamp_timeout
(单位:分钟):Defaults timestamp_timeout=30 # 30分钟后需重新输入密码
- 日志审计
sudo
操作记录在系统日志中(通常位于/var/log/auth.log
文件中)。
4、常见问题
-
用户不在sudoers文件中
-
用root用户执行 visudo,添加用户或用户组。
-
若无法使用root,需通过恢复模式或单用户模式修复。
-
-
sudo提示找不到命令
- 使用绝对路径:sudo /usr/sbin/command
- 在sudoers中配置secure_path。
5、安全建议
-
最小权限原则:仅授予必要的命令权限。
-
避免滥用NOPASSWD:仅在必要时允许免密操作。
-
定期审计日志:监控可疑的sudo操作。
总结: 通过合理配置sudo,可以在保障系统安全的同时,灵活管理用户权限。
6.2 用户唯一标识符(UID)
在 Linux 系统中,
UID(User Identifier,用户标识符)
是用于唯一标识用户的数字标识。每个用户都有一个独立的 UID,系统通过 UID 管理用户权限、资源访问等操作。
1、UID的含义
- 核心作用
UID
是 Linux 用户身份的核心标识,决定了用户的权限范围和资源所有权。系统通过UID
(而非用户名)进行权限验证。 - UID 分配规则
-
0
:root 用户的 UID,拥有最高权限。 -
1~999(系统用户)
:通常分配给系统服务或守护进程(如 www-data、mysql),不同发行版范围略有差异(如 RHEL/CentOS 用 1-999,Ubuntu 用 1-999 或 1-499)。 -
1000+(普通用户)
:普通登录用户的 UID 从此范围分配。
-
2、UID 的用途
-
权限控制
-
文件/目录的权限通过
UID 和 GID(组标识符)
管理。例如,chown user:group file 实际修改的是 UID 和 GID。 -
进程运行时,以启动用户的
UID
决定其权限(如能否访问特定文件)。
-
-
系统管理
-
root
特权:UID 0
的用户可绕过所有权限限制。 -
服务运行:系统服务以特定
UID
运行(如 Nginx 以 www-data 用户运行),提高安全性。
-
-
跨系统一致性
- 在容器或分布式系统中,
UID
用于保持用户身份的一致性(如 Docker 容器与宿主机用户映射)。
- 在容器或分布式系统中,
3、查看用户UID
-
查看当前用户
id -u # 显示当前用户的 UID
-
查看指定用户
id -u username # 如 id -u root 返回 0
4、特殊 UID
-
UID 0
:root
用户,拥有系统完全控制权。
⚠️ 若普通用户 UID 被改为 0,则获得 root 权限(高风险操作!)。 -
UID 65534
:通常代表nobody
用户,用于低权限运行进程。
5、注意事项
-
唯一性: 同一系统内
UID
必须唯一,重复可能导致权限混乱。 -
系统依赖: ·某些服务依赖特定
UID
(如 MySQL 默认使用 UID mysql),随意修改会导致服务故障。 -
配置文件:
/etc/login.defs
:定义UID
分配范围(如 UID_MIN 1000)。/etc/passwd
:存储用户与UID
的映射关系。
总结:
UID 是 Linux 用户管理的基石,直接影响权限控制和系统安全。合理分配和修改 UID 能优化权限管理,但在操作时需谨慎,避免破坏现有服务或文件权限。
6.3 修改账户属性(usermod)
usermod命令是Linux系统中用于修改用户账户属性的实用工具。系统管理员可以使用它来更改用户的各类设置,如用户组、家目录、登录shell等。
1、基本语法
usermod [选项] 用户名
2、常用选项
-
用户组相关
-g
或--gid
:修改用户的主组(primary group)usermod -g 新主组名 用户名
-G
或--groups
:修改用户的附加组(supplementary groups)usermod -G 组1,组2,组3 用户名
-a
或--append
:将用户追加到附加组中(不覆盖原有附加组)usermod -a -G 组名 用户名
-
账户信息相关
-l
或--login
:修改用户名usermod -l 新用户名 旧用户名
-d
或--home
:修改用户家目录usermod -d 新家目录路径 用户名
-m
或--move-home
:与-d
一起使用,移动原家目录内容到新位置usermod -d 新家目录路径 -m 用户名
-s
或--shell
:修改用户默认shellusermod -s /bin/bash 用户名
-
账户状态相关
-L
或--lock
:锁定用户账户usermod -L 用户名
-U
或--unlock
:解锁用户账户usermod -U 用户名
-e
或--expiredate
:设置账户过期日期(YYYY-MM-DD格式)usermod -e 2023-12-31 用户名
-
其他选项
-u
或--uid
:修改用户UIDusermod -u 新UID 用户名
-c
或--comment
:修改用户备注信息(通常是全名)usermod -c "张三" zhangsan
3、使用示例
-
将用户
john
添加到sudo
组中:usermod -aG sudo john
-
修改用户
mary
的家目录并移动原有文件:usermod -d /home/mary_new -m mary
-
更改用户
tom
的登录名和家目录:usermod -l tom_new -d /home/tom_new -m tom
-
锁定用户
test
的账户:usermod -L test
4、注意事项
-
执行
usermod
命令需要root
权限,通常使用sudo
。 -
修改用户属性时,该用户不应处于登录状态,否则可能导致不可预知的问题。
-
修改
UID
时,需要手动更改用户文件的所属权。 -
修改用户名不会自动更改家目录名称,需要配合
-d
和-m
选项使用。 -
某些修改可能需要用户重新登录才能生效。
6.4 删除用户(userdel)
1、userdel 命令的基本用法
语法:
userdel [选项] 用户名
userde
l 用于删除用户账户及其相关文件(如家目录、邮件池等)。
常用选项:
-
-r
:删除用户的同时,删除其家目录和邮件池(通常位于 /home/用户名 和 /var/mail/用户名)。 -
-f
:强制删除用户(即使用户已登录或存在未完成的进程)。
2、常用方法示例:
-
删除用户但保留家目录:
userdel username
仅删除用户账户,/home/username 目录会保留。
-
删除用户并同时删除家目录:
userdel -r username
彻底删除用户及其家目录和邮件池。
-
强制删除用户(即使该用户已登录):
userdel -f username
谨慎使用,可能导致数据或进程异常。
3、注意事项
-
需要 root 权限:必须使用
sudo
或以root
用户运行。 -
用户正在登录时:若用户当前已登录或存在未结束的进程,直接删除可能失败。可以:
-
先强制注销用户(
pkill -u username
或skill -KILL -u username
)。 -
使用
-f
强制删除(不推荐生产环境使用)。
-
-
关联文件:
userdel
默认不会删除用户在其他位置创建的文件(如 /var/www/ 下的文件),需手动清理。 -
用户组:如果用户是某个组的唯一成员,该组不会被自动删除(需手动用
groupdel
删除)。
6.5 创建用户组(groupadd)
groupadd
命令用于在Linux系统中创建新的用户组。
1、基本语法
groupadd [选项] 组名
常用选项:
选项 | 描述 |
---|---|
-g GID | 指定新用户组的组ID (GID) |
-o | 允许创建有重复GID的组 |
-f | 如果组已存在则强制成功退出 |
-r | 创建一个系统组 (GID小于1000) |
-K KEY=VALUE | 覆盖/etc/login.defs中的默认值 |
-p | 为新组设置加密密码(不常用) |
2、常用方法使用示例
-
创建基本用户组
groupadd developers
-
创建指定GID的用户组
groupadd -g 1005 testers
-
创建系统组
groupadd -r systemgroup
-
强制创建组(如果已存在则忽略错误)
groupadd -f existinggroup
-
创建有密码的组(较少使用)
groupadd -p encrypted_password securegroup
3、注意事项
-
通常需要
root
权限才能执行groupadd
命令,所以前面要加sudo
-
默认情况下,新组的
GID
从1000开始(非系统组) -
组信息存储在
/etc/group
文件中 -
可以使用
getent group
组名来验证组是否创建成功
创建组后,您可以使用usermod
命令将用户添加到新创建的组中。
6.6 删除用户组(groupdel)
groupdel
是 Linux 系统中用于删除用户组的命令。
1、基本语法
groupdel [选项] 组名
常用选项:
-f, --force
:强制删除组,即使它是某个用户的主组-h, --help
:显示帮助信息-R, --root CHROOT_DIR
:在指定的 CHROOT_DIR 目录中应用更改
2、常用方法使用示例
-
删除普通用户组:
groupdel developers
这将删除名为 “developers” 的组。
-
强制删除组(即使它是某个用户的主组):
groupdel -f testgroup
3、注意事项
-
需要
root
权限才能执行此命令,因此通常需要使用sudo
。 -
不能删除包含用户的组(除非使用 -f 选项):
-
如果一个组是某个用户的主组(在
/etc/passwd
中指定),默认情况下不能删除 -
如果一个组是某个用户的附加组(在
/etc/group
中列出),可以删除
-
-
删除组前,建议先检查该组是否存在:
grep groupname /etc/group
-
删除组后,所有属于该组的文件将保留其
GID
,直到手动更改它们。
4、实际应用场景
# 1、检查组是否存在
grep testgroup /etc/group
# 2、删除组
sudo groupdel testgroup
# 3、验证是否删除成功
grep testgroup /etc/group
使用 groupdel
命令时要谨慎,确保不会影响系统上运行的服务或应用程序。
6.7 管理用户组成员(groupmems)
groupmems
是Linux系统中用于管理用户组成员的命令,它允许管理员或组管理员(group administrator)管理一个组的成员列表,而无需root权限(前提是有相应权限)。
1、基本语法
groupmems [选项] [动作]
常用动作:
-
-a, --add USERNAME
:将指定用户添加到组中 -
-d, --delete USERNAME
:从组中删除指定用户 -
-l, --list
:列出组的所有成员 -
-p, --purge
:清空组的所有成员
常用选项:
-
-g, --group GROUPNAME
:指定要操作的组(默认为调用者的主组) -
-R, --root CHROOT_DIR
:在指定的chroot目录中应用更改
2、常用方法使用示例
-
列出当前用户主组的成员
groupmems -l
-
列出指定组的成员
groupmems -g developers -l
-
添加用户到组
groupmems -g developers -a johndoe
-
从组中删除用户
groupmems -g developers -d johndoe
-
清空组的所有成员
groupmems -g developers -p
3、注意事项
-
只有
root
用户或组管理员才能使用此命令修改组成员 -
如果未指定
-g
选项,默认操作当前用户的主组 -
此命令通常用于管理次要组(
secondary groups
),而不是主组(primary group
) -
要成为组管理员,可以使用
gpasswd
命令设置:gpasswd -A username groupname
groupmems
提供了一种更精细的方式来管理组成员,特别适合需要委派组管理权限的场景。
6.8 管理组密码和组成员(gpasswd)
gpasswd
命令是Linux系统中用于管理组密码和组成员的重要工具。它允许管理员控制哪些用户可以成为组的成员或者获得组的管理权限。
1、基本语法
gpasswd [选项] 组名
常用选项:
选项 | 描述 |
---|---|
-a 用户名 | 将用户添加到组中 |
-d 用户名 | 从组中移除用户 |
-r | 移除组的密码 |
-R | 限制只有组成员才能用newgrp加入该组 |
-A 用户名,... | 设置组管理员列表 |
-M 用户名,... | 设置组成员列表(会覆盖现有成员) |
2、常用方法示例
-
将用户添加到组中
gpasswd -a username groupname
-
从组中移除用户
gpasswd -d username groupname
-
设置组密码
gpasswd groupname
执行后会提示输入密码
-
移除组密码
gpasswd -r groupname
-
设置组管理员
gpasswd -A admin1,admin2 groupname
-
批量设置组成员(会覆盖现有成员)
gpasswd -M user1,user2,user3 groupname
3、注意事项
-
只有
root
用户或组管理员才能使用gpasswd
命令 -
组密码允许非组成员通过
newgrp
命令临时加入该组 -
使用
-R
选项后,即使知道密码,非组成员也无法通过newgrp
加入该组 -
修改组成员后,用户需要重新登录才能使更改生效
通过合理使用gpasswd
命令,可以有效地管理Linux系统中的组权限和成员关系。
6.9 临时切换用户组(newgrp)
newgrp
命令在Linux系统中用于切换用户的当前组身份,允许用户在不注销的情况下临时切换到其他用户组。
1、基本语法
newgrp [group]
主要功能:
-
临时将用户的当前组更改为指定的组
-
创建一个新的shell环境,在该环境中用户具有新的组权限
-
退出该shell环境后(输入
exit
或按Ctrl+d
),用户将恢复原来的组身份
2、常用方法使用示例
-
切换到另一个组:
newgrp developers
这将把当前用户的组切换为"developers"组
-
查看当前组:
切换后可以使用以下命令验证:groups
或
id -gn
-
退出新组环境:
exit # 或 ctrl+d
这将返回到原来的组环境
3、注意事项
-
用户必须是要切换组的成员才能使用
newgrp
命令 -
如果组有密码,系统会提示输入密码(除非用户是
root
或组管理员) -
该命令会启动一个新的
shell
,所以退出时需要退出这个shell
-
环境变量(如
HOME, SHELL, USER, LOGNAME
等)保持不变 -
工作目录保持不变
4、实际应用场景
-
当用户需要临时访问某个组的文件权限时
-
当用户需要以不同组身份执行某些命令时
-
在多组环境中快速切换工作身份
6.10 修改用户组属性(groupmod)
groupmod命令用于修改Linux系统中已存在的用户组信息。
1、基本语法
groupmod [选项] 组名
常用选项:
选项 | 描述 |
---|---|
-g GID | 修改组的GID(组ID) |
-n 新组名 | 修改组的名称 |
-o | 允许使用重复的GID(通常不推荐) |
2、常用方法使用示例
-
修改组名(将oldgroup改名为newgroup):
groupmod -n newgroup oldgroup
-
修改组ID(将组group1的GID改为1005):
groupmod -g 1005 group1
-
同时修改组名和GID:
groupmod -g 1006 -n newgroup oldgroup
3、注意事项
-
执行
groupmod
命令需要root权限,所以通常需要加上sudo
-
修改组名或
GID
后,与该组相关的文件权限可能需要更新 -
某些服务如果使用了特定的组名或
GID
,修改后可能导致服务异常 -
修改
GID
时,新GID
通常应在1000-60000
范围内(系统组通常使用0-999
)
4、查看修改结果
修改后可以使用以下命令验证:
getent group 组名
或
grep 组名 /etc/group
6.11 管理用户密码和账户的有效期(chage)
chage
是 Linux 系统中用于管理用户密码过期和账户有效期的命令。它可以设置密码的最后修改日期、密码过期时间、账户失效时间等。
1、基本语法
chage [选项] 用户名
常用选项:
选项 | 描述 |
---|---|
-d 天数或日期 | 设置密码最后修改日期(例如 YYYY-MM-DD 或从 1970-1-1 起的天数)。 |
-E 日期或天数 | 设置账户过期日期(YYYY-MM-DD 或天数),过期后用户无法登录。 |
-I 天数 | 密码过期后的宽限天数(若未修改密码,账户会被锁定)。 |
-l | 列出用户的密码和账户过期信息。 |
-m 天数 | 密码最短使用天数(在此期间不能修改密码)。 |
-M 天数 | 密码最长使用天数(到期后必须修改密码)。 |
-W 天数 | 密码到期前的警告天数(提前提醒用户)。 |
2、常用方法使用示例
-
查看用户的密码有效期信息
chage -l username
输出示例:
-
设置密码最长有效期(90 天后过期)
chage -M 90 username
-
设置密码最短修改间隔(7 天内不能改密码)
chage -m 7 username
-
强制用户下次登录时修改密码
chage -d 0 username
-
设置账户过期日期(例如 2025-12-31)
chage -E 2025-12-31 username
或使用天数(从 1970-1-1 起):
chage -E $(date -d "2025-12-31" +%s) username
-
禁用账户过期(设为 -1)
chage -E -1 username
-
设置密码到期前 7 天警告
chage -W 7 username
3、注意事项
-
需要
root
权限 或sudo
才能修改其他用户的设置。 -
日期格式可以是
YYYY-MM-DD
或从1970-1-1
起的天数。 -
使用
chage -l
可以验证修改后的结果。
4、实际场景示例
目标:创建一个临时账户 tempuser
,设置其密码 30
天后过期,并在到期前 5
天提醒用户。
# 创建用户
useradd tempuser
passwd tempuser
# 设置密码策略
chage -M 30 -W 5 -I 7 tempuser
# 验证设置
chage -l tempuser
通过 chage
,管理员可以灵活管理用户密码和账户的生命周期,增强系统安全性。
7、创建一个用户的系统工作流程
在linux中创建用户,通常都是使用命令:
useradd 用户名
,那么在运行该命令后,系统在后台是如何工作的呢?我们接着往下看:
创建一个用户:useradd lisi
,工作流程如下:
-
运行命令后,系统会在
/etc/passwd
文件中添加用户lisi
相关信息,同时在/etc/group
文件中添加组的相关信息/etc/passwd
文件,如下:
/etc/group
文件,如下:
-
如果使用
passwd
命令为用户创建了密码,密码则会以密文的形式保存在/etc/shadow
中/etc/shadow
文件,如下:
-
默认会为用户创建一个家目录:
/home/lisi
,并修改家目录的所属人和所属组为lisi
,其控制权限也会开放给lisi
-
将
/etc/skel
目录中.bash
开头的文件复制到/home/lisi
(家目录)中,这些.bash
文件是调用解释器工作的脚本文件或程序/etc/skel
目录中的文件都是隐藏文件,需要使用命令:ls -a
才能显示,如下:
总结:
从上面我们了解了使用useradd
命令后,系统创建用户的一个完整流程。因此;当我们不使用命令,需要手动创建一个用户时,就必须遵循上述流程,依次完善每个文件内容,才能创建一个可登录、拥有shell环境的用户,缺少任何一个环节,都不能创建出一个完整的用户。
8、知识扩展
8.1 实现任何用户免密码登录(包括root)
1、方法1:通过passwd
命令实现免密码登录
passwd -d 用户名
在root
用户下,通过上述命令可以删除任何用户的密码,包括root
,删除密码后,在切换用户时不用输入密码,即可立即登录该用户,若需要恢复密码,重新通过passwd
命令设置即可
2、方法2:通过修改/etc/passwd
文件实现免密码登录
- 通过命令:
vim /etc/passwd
编辑文件内容,将需要修改的用户那一行的密码占位符x
删除,这样密码就无法定向到加密文件/etc/shadow
,从而实现免密登录,如下:
将上面lisi
用户的密码占位符x
删除后,即可实现免密登录lisi
用户,同理删除其它用户的x
,也可实现免密登录,若想恢复密码登录,同样通过passwd
命令重新设置即可,重新设置密码后,/etc/passwd
文件中的用户会重新生成密码占位符x
8.2 用户名与主机名的区别?
在Linux系统中,
用户名(Username)
和主机名(Hostname)
是两个不同的概念,分别用于标识用户和计算机本身。
1、 用户名(Username)
-
作用: 标识系统中的用户账户,用于登录、权限管理和资源访问控制。
-
特点:
-
每个用户有唯一的用户名(如
root、alice
)。 -
与用户ID(
UID
)绑定,系统内部通过UID识别用户。 -
存储在
/etc/passwd
文件中。 -
用于登录系统(如
ssh username@hostname
)。
-
-
示例:
whoami # 查看当前用户名 id # 查看当前用户信息
2、主机名(Hostname)
-
作用: 标识网络中的计算机(主机),用于区分不同的设备。
-
特点:
-
每台计算机有唯一的主机名(如
localhost、my-pc
)。 -
用于网络通信(如SSH连接、局域网识别)。
-
存储在
/etc/hostname
文件中,可通过hostnamectl
命令修改。 -
通常显示在终端提示符中(如
user@hostname:~$
)。
-
-
查看和修改主机名:
-
查看当前主机名
hostname # 只显示主机名 hostnamectl # 显示主机名、 系统类型、系统ID、系统名称等信息 cat /etc/hostname # 查看主机名文件,该文件用于存放主机名
-
修改主机名
-
临时修改主机名(重启后失效)
hostname 新主机名 # 运行命令后,重新打开终端,即可显示新的主机名,重启系统后失效,恢复为默认主机名
-
永久修改主机名
方法1: 使用hostnamectl
命令修改hostnamectl set-hostname 新主机名 # 重新打开终端即可显示新的主机名,重启后不会失效
方法2: 手动修改
/etc/hostname
文件vim /etc/hostname # 用该命令打开文件,修改主机名
如下:修改其中的主机名,保存退出即可,重新打开终端即可显示新的主机名
总结:
通过上述方法,你可以永久修改 Linux 系统的主机名称。推荐使用hostnamectl
,因为它是最简单且兼容性最好的方式。 -
-
3、用户名与主机名的关键区别
特性 | 用户名 | 主机名 |
---|---|---|
用途 | 标识用户 | 标识计算机(主机) |
存储位置 | /etc/passwd | /etc/hostname |
修改命令 | usermod、useradd | hostnamectl、hostname |
网络作用 | 仅本地系统使用 | 局域网/网络通信中可见 |
显示位置 | 终端提示符(user@部分) | 终端提示符(@hostname部分) |
示例: 从下面可以看到,@
前面的是 用户名(root),@
后面的是 主机名(localhost)
总结:
-
用户名 = 你是谁(用户身份)。
-
主机名 = 你在哪台机器上(设备身份)。
两者共同构成Linux系统和网络中的唯一标识(如 user@hostname
)。