usermod 命令用于修改 Linux 中已存在的用户账户,涵盖组归属、登录 Shell、家目录、UID 以及账户锁定。本文还涵盖与之配合使用的组管理命令。
1. 基本语法
| 命令 |
说明 |
sudo usermod [选项] username |
通用语法 |
sudo usermod -c "全名" username |
修改 GECOS/注释字段 |
id username |
显示 UID、GID 和组归属 |
getent passwd username |
显示用户的账户条目 |
usermod --help |
列出所有可用选项 |
2. 附加组管理
添加或移除次要组归属。
| 命令 |
说明 |
sudo usermod -aG docker username |
将用户加入一个组 |
sudo usermod -aG docker,sudo username |
将用户加入多个组 |
sudo usermod -G docker username |
将所有附加组替换为 docker |
sudo usermod -rG docker username |
将用户从一个组中移除 |
sudo gpasswd -d username docker |
从组中移除用户(替代方法) |
重要: -G 不带 -a 会替换用户的所有附加组,始终使用 -aG 来追加。
3. 主组管理
修改用户创建新文件时分配的组。
| 命令 |
说明 |
sudo usermod -g developers username |
设置主组为 developers |
id -gn username |
显示用户的主组 |
newgrp developers |
以 developers 为活动组启动 Shell |
sudo chgrp developers file |
修改文件的组所有权 |
sudo chgrp -R developers dir/ |
递归修改组所有权 |
4. 家目录与 Shell
| 命令 |
说明 |
sudo usermod -d /srv/username -m username |
修改家目录路径并移动内容 |
sudo usermod -d /srv/username username |
仅修改家目录路径(旧文件留在原地) |
sudo usermod -s /bin/zsh username |
修改登录 Shell |
sudo usermod -s /usr/sbin/nologin username |
禁用交互式登录 |
cat /etc/shells |
列出有效的登录 Shell |
5. 重命名与 UID 修改
修改登录名或数字用户 ID。
注意: 使用 -u 前先记录旧 UID,运行 chown 前先审查 find 结果。
| 命令 |
说明 |
sudo usermod -l newname oldname |
重命名用户账户 |
sudo usermod -l newname -d /home/newname -m oldname |
重命名用户并移动家目录 |
sudo groupmod -n newname oldname |
重命名匹配的用户私有组 |
old_uid=$(id -u username) |
修改前记录当前 UID |
sudo usermod -u 1050 username |
修改 UID(家目录中的文件会更新) |
sudo find /srv -xdev -uid "$old_uid" -print |
预览 /srv 下仍属旧 UID 的文件 |
sudo find /srv -xdev -uid "$old_uid" -exec chown -h username {} + |
将 /srv 下旧 UID 文件重新分配给用户 |
说明:
- 将
/srv 替换为需要修复的目录或挂载点
-xdev 选项停留在该文件系统内,其他挂载需单独扫描
- 在同一 Shell 会话中操作,确保
$old_uid 变量可用
6. 锁定、解锁与过期
| 命令 |
说明 |
sudo usermod -L username |
锁定账户密码 |
sudo usermod -U username |
解锁账户密码 |
sudo usermod -e 2026-12-31 username |
设置账户过期日期 |
sudo usermod -e "" username |
移除过期日期 |
sudo chage -l username |
显示过期和密码老化详情 |
注意:
-L 仅阻止密码认证;SSH 密钥可能仍然有效
-U 不会移除账户过期日期;需要时单独使用 -e ""
7. 组管理
创建、重命名和删除组。
| 命令 |
说明 |
sudo groupadd developers |
创建组 |
sudo groupadd -g 1500 developers |
创建指定 GID 的组 |
sudo groupadd -r appgroup |
创建系统组 |
sudo groupmod -n devs developers |
重命名组 |
sudo groupdel developers |
删除组 |
8. 列出用户和组
| 命令 |
说明 |
groups username |
列出用户所属的组 |
getent group developers |
显示组条目和明确列出的成员 |
getent group |
列出所有组 |
getent passwd |
列出所有用户账户 |
cut -d: -f1 /etc/group |
仅列出本地组名 |
注意: 主组归属记录在 passwd 数据库中,因此主组成员可能不在 getent group 输出中。使用 id username 检查用户的主组和附加组。
9. 实用组合模式
| 命令 |
说明 |
sudo usermod -aG sudo,docker,developers username |
一次添加多个附加组 |
sudo usermod -aG docker $(whoami) && newgrp docker |
将自己加入 docker 组并立即激活 |
sudo usermod -s /usr/sbin/nologin -e 2026-12-31 tempuser |
创建临时服务账户 |
sudo usermod -L -e 1 username |
锁定并立即过期账户 |
for u in user1 user2 user3; do sudo usermod -aG developers $u; done |
批量将用户加入组 |
getent group developers \| cut -d: -f4 \| tr ',' '\n' |
列出组内明确成员 |
10. 故障排查
| 问题 |
解决方法 |
user username is currently used by process |
在 -l、-u 或 -d 前让用户登出并停止其进程 |
| 新组未激活 |
登出后重新登录,或运行 newgrp groupname |
| 用户丢失其他组 |
-G 不带 -a 会替换列表;用 -aG 重新添加缺失的组 |
group 'name' does not exist |
先用 groupadd 创建 |
unlocking the user's password would result in a passwordless account |
用 passwd 设置密码,而非使用 -U |
11. 常用选项速查
| 选项 |
说明 |
-aG |
追加附加组(不替换) |
-G |
设置附加组(会替换) |
-rG |
从组中移除用户 |
-g |
修改主组 |
-d |
修改家目录路径 |
-m |
配合 -d 移动家目录内容 |
-s |
修改登录 Shell |
-l |
重命名账户 |
-u |
修改 UID |
-L |
锁定密码 |
-U |
解锁密码 |
-e |
设置账户过期日期 |
-c |
修改注释字段 |
12. 小结
| 知识点 |
要点总结 |
| 基本语法 |
sudo usermod [选项] username |
| 附加组 |
-aG 追加,-G 替换(危险) |
| 主组 |
-g 修改主组 |
| 家目录 |
-d 改路径,-m 移动内容 |
| Shell |
-s 修改登录 Shell |
| 重命名/UID |
-l 重命名,-u 改 UID |
| 锁定/过期 |
-L 锁定,-U 解锁,-e 设过期 |
| 组管理 |
groupadd、groupmod、groupdel |
13. 思考与练习
(1)使用 usermod -aG 将用户加入 docker 组。
(2)修改某用户的登录 Shell 为 /bin/zsh,然后验证。
(3)记录某用户的当前 UID,然后修改为 1050,并检查家目录文件的归属。
(4)创建一个带过期日期的临时用户账户。
(5)使用 groupadd 创建组,然后用 usermod -g 设置某用户的主组。
(6)解释 -G 和 -aG 的区别,并举例说明为什么 -aG 更安全。
在 Linux 服务器日常运维中,熟练使用 usermod 管理用户账户的组归属与登录环境,是保障多用户系统安全与权限清晰的基础。想系统掌握这类用户与权限管理技能,可以从 Linux 系统管理与 Shell 编程基础入门 开始,课程覆盖用户与权限、Shell 脚本及自动化运维的核心内容,帮助你更全面地理解 Linux 账户体系。
|