usermod 是什么
usermod 修改已存在账号的属性:所属组、家目录、登录 shell、UID、口令状态与过期时间。它最容易出事的地方在组参数——-G 会把附加组整体替换成给定的列表,-aG 才是在原有基础上追加。这个字母之差在日常操作里看不出区别,一直到某天发现账号丢了 sudo 权限或者读不到共享目录,才会回溯到那次「只是加了个组」的操作。
基本信息
| 适用平台 | Linux 全发行版(shadow-utils / passwd 包) |
|---|---|
| 命令语法 | usermod [选项] 用户名 |
| 组相关选项 | -aG 追加附加组(保留原有)、-G 覆盖附加组、-g 修改主组 |
| 其他常用选项 | -s 登录 shell、-d 家目录、-m 与 -d 连用同时搬移家目录内容、-L 锁定口令、-U 解锁、-u 修改 UID、-l 修改用户名、-e 账号过期日期、-c 注释 |
| 权限要求 | 需要 root 或 sudo |
典型使用场景
- 授权新组的访问权:用 -aG 把用户加入 docker、developers 等附加组
- 冻结账号:人员离职或临时停用时先 -L 锁定,观察一段时间再决定是否删除
- 禁止登录但保留服务:把 shell 改为 /sbin/nologin,账号仍可用于运行进程
- 迁移家目录:把家目录移到数据盘,用 -d 与 -m 一起完成搬家
- 统一 UID:跨主机对齐账号 UID,避免共享存储上的文件属主错乱
- 改名:用 -l 修改用户名,同时按需调整家目录与 cron 任务
常用示例
常用示例
usermod -aG docker,developers deploy # 追加附加组(保留原有组)
usermod -s /sbin/nologin olduser # 禁止交互登录
usermod -L deploy # 锁定账号
usermod -U deploy # 解锁
usermod -d /data/home/deploy -m deploy # 改家目录并搬移内容
usermod -u 1500 deploy # 修改 UID(记得同步文件属主)
usermod -l newname oldname # 修改用户名
usermod -e 2026-12-31 temp01 # 设置账号过期日期
id deploy; passwd -S deploy # 改完核对结果选项对照
| 选项 | 作用 | 风险提示 |
|---|---|---|
| -aG | 追加附加组 | 正确写法,保留原有组 |
| -G | 覆盖附加组列表 | 最容易误用,会静默剥夺原有权限 |
| -g | 修改主组 | 影响新建文件的属组 |
| -d -m | 改家目录并搬移内容 | 搬移期间目标空间要足够 |
| -u | 修改 UID | 旧文件属主会显示为数字,需同步 chown |
| -L / -U | 锁定与解锁口令 | 软锁,密钥登录仍可能生效 |
改 UID、用户名与家目录属于连带影响较大的操作:家目录、日志目录、应用数据、共享存储上的文件都要同步 chown;用户名相关还会牵涉 /var/spool/cron/ 下的定时任务目录名、邮件队列与部分应用的配置文件引用。操作前先列出该账号引用的资源,比事后逐个救火更省时间。
组成员变更不会影响已经建立的会话:正在登录的终端、已启动的进程仍然使用旧的组权限,需要重新登录或执行 newgrp 才能拿到新组。排查「加了组还是不生效」时先确认这一点,再怀疑配置。
usermod -L 只是把口令哈希前加感叹号的软锁,用户若保留了 SSH 公钥仍能登录。需要彻底禁止登录时,应同时把 shell 改为 /sbin/nologin、清理 ~/.ssh/authorized_keys,或直接删除账号并妥善处理其遗留文件。
批量变更前先留证据:改动前后各存一份 id 用户名 与 getent group 组名 的输出,组的增减一眼可见。涉及 UID 或用户名的变更建议记入变更台账,完成后用 find 路径 -user 旧UID 扫描共享存储,确认没有遗留的权限归属问题。
改 UID 或用户名之前先盘点影响面:家目录、定时任务、服务单元里硬编码的用户名、容器映射与备份策略都会跟着受影响。做法是先在配置与脚本里批量搜出引用位置,改完逐项核对并重新设置文件属主,最后再让相关服务重启。