在Unix/Linux发行版中,创建用户账户后,在某些场景下我们需要更改现有用户的属性,例如更改用户的家目录、登录名、登录shell、密码过期日期等。在这种情况下,就需要使用 usermod 命令。
当我们在终端中执行 usermod 命令时,会涉及并影响以下文件:
/etc/shadow – 安全的账户信息(密码等)。/etc/login.defs – 影子密码套件配置。
基本语法:
usermod [选项] 用户名
使用前提条件
- 只有超级用户 (root) 才允许执行
usermod命令。 usermod命令可以在任何 Linux 发行版上执行。
usermod 命令选项
usermod 命令使用简单,下表提供大量选项来修改现有用户。
| |
|---|
-c | |
-d | |
-e | |
-g | |
-G | |
-a | |
-l | |
-L | |
-m | 将家目录的内容从旧目录移动到新目录(与 -d 联用)。 |
-p | |
-s | |
-u | 为用户账户分配UID(通常在0到999之间,实际范围取决于系统)。 |
-U | |
下面将介绍 15个 usermod 命令的实际经典用法。
1. 为用户账户添加注释信息
-c 选项用于为用户账户设置简要的注释信息。例如,让我们为 yadmin 用户添加信息。
[root@erpserver ~]# usermod -c "This is yadmin" yadmin
[root@erpserver ~]#
添加信息后,可以在 /etc/passwd 文件中查看此注释。
[root@erpserver ~]# cat /etc/passwd | grep -E 'yadmin'
yadmin:x:1000:1000:This is yadmin:/home/yadmin:/bin/bash
[root@erpserver ~]#
2. 更改用户家目录
在上一步中,我们可以看到用户家目录是 /home/yadmin/。如果需要将其更改为其他目录,可以使用 -d 选项。
例如,我想将其更改为 /var/www/,在更改之前,先查看用户的当前家目录,为默认目录/home/yadmin:
[root@erpserver ~]# grep -E '/home/yadmin' /etc/passwd
yadmin:x:1000:1000:This is yadmin:/home/yadmin:/bin/bash
[root@erpserver ~]#
现在,将家目录从 /home/yadmin 更改为 /var/www/:
[root@erpserver ~]# usermod -d /var/www/ yadmin
[root@erpserver ~]#
再次确认更改后的家目录:
[root@erpserver ~]# grep -E '/var/www' /etc/passwd
yadmin:x:1000:1000:This is yadmin:/var/www/:/bin/bash
[root@erpserver ~]#
3. 设置用户账户过期日期
-e 选项用于以 YYYY-MM-DD 格式设置用户账户的过期日期。在设置之前,先用 chage 命令检查当前账户的过期状态。
[root@erpserver ~]# chage -l yadmin
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
[root@erpserver ~]#
yadmin 用户的过期日期为从不过期,让我们用 usermod -e 将其改为 2026年2月14日,并用 chage 命令确认。
[root@erpserver ~]# usermod -e 2026-02-14 yadmin
[root@erpserver ~]# chage -l yadmin
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :2月 14, 2026
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
[root@erpserver ~]#
4. 更改用户主组
要设置或更改用户的主组,在usermod命令中使用 -g 选项。
在更改之前,先检查用户 yadmin 的当前组信息。
[root@erpserver ~]# id yadmin
uid=1000(yadmin) gid=1000(yadmin) 组=1000(yadmin)
现在,将 admin 组设置为 yadmin 用户的主组,并确认更改。
[root@erpserver ~]# usermod -g admin yadmin
[root@erpserver ~]# id yadmin
uid=1000(yadmin) gid=1002(admin) 组=1002(admin),1000(yadmin)
5. 向现有用户添加新组
如果想将名为 admin02 的新组添加到 yadmin 用户,可以如下使用 -G 选项。
[root@erpserver ~]# usermod -G admin02 yadmin
[root@erpserver ~]# id yadmin
uid=1000(yadmin) gid=1002(admin) 组=1002(admin),1003(admin02)
注意:
单独使用 -G 选项为现有用户添加新组时,会移除该用户原来所属的所有附属组。因此,通常应结合 -a(追加)和 -G 选项来添加或追加新组。
6. 向用户追加附属组
如果需要将用户添加到某个附属组,可以使用 -a 和 -G 选项。例如,这里我们将用户账户 yadmin 添加到 wheel 组。
[root@erpserver ~]# usermod -aG wheel yadmin
[root@erpserver ~]# id yadmin
uid=1000(yadmin) gid=1002(admin) 组=1002(admin),10(wheel),1003(admin02)
这样,yadmin 用户既保留在其主组中,也成为了 wheel 组的成员。这使得普通用户账户可以在 Linux 中执行需要 root 权限的命令。
sudo service httpd restart
7. 更改用户登录名
要更改现有用户的登录名,可以使用 -l(新登录名)选项。在下面的示例中,我们将登录名 yadmin 更改为 yadmin_admin。
[root@erpserver ~]# usermod -l yadmin_admin yadmin
现在检查 yadmin 用户,它将不存在,因为它已被重命名为 yadmin_admin。
[root@erpserver ~]# id yadmin
id: yadmin: no such user
[root@erpserver ~]#
检查 yadmin_admin 账户,它将存在,并拥有相同的 UID 以及之前添加的所属组。
[root@erpserver ~]# id yadmin_admin
uid=1000(yadmin_admin) gid=1002(admin) 组=1002(admin),10(wheel),1003(admin02)
8. 锁定用户账户
要锁定任何系统用户账户,可以使用 -L(锁定)选项。
账户锁定后,将无法使用密码登录。会在 /etc/shadow 文件的加密密码前看到一个 !,表示密码已禁用。
[root@erpserver ~]# usermod -L yadmin_admin
检查被锁定的账户。
[root@erpserver ~]# grep -E 'yadmin_admin' /etc/shadow
yadmin_admin:!$6$MEdhMafZvHlRm5hx$iI.UMIfAwReEFDYO77lk1DOtdGsckOEBjP8BmBo8jeRGUgeKZ60jXb25yLRs.DZNSJWzj7/bQDtd2tk/bfFzs0::0:99999:7::20498:
9. 解锁用户账户
-U 选项用于解锁任何被锁定的用户,这将移除加密密码前的 !。
[root@erpserver ~]# usermod -U yadmin_admin
解锁后验证用户。
[root@erpserver ~]# grep -E 'yadmin_admin' /etc/shadow
yadmin_admin:$6$MEdhMafZvHlRm5hx$iI.UMIfAwReEFDYO77lk1DOtdGsckOEBjP8BmBo8jeRGUgeKZ60jXb25yLRs.DZNSJWzj7/bQDtd2tk/bfFzs0::0:99999:7::20498:
10. 将用户家目录及文件移动到新位置
假设你有一个用户账户 imoon,其家目录为 /home/imoon,你想将其移动到新位置,例如 /var/imoon。可以使用 -d 和 -m 选项将现有用户文件从当前家目录移动到新家目录。
检查账户及其当前家目录下的文件。
[root@erpserver ~]# ll /home/imoon/
总用量 0
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest10.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest1.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest2.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest3.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest4.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest5.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest6.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest7.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest8.txt
-rw-r--r-- 1 root root 0 2月 2 10:20 mytest9.txt
[root@erpserver ~]#
现在,将家目录从 /home/imoon 移动到 /var/imoon。
usermod -m -d /var/imoon -u 1004 imoon
11. 为用户创建未加密的密码
要创建未加密的密码,我们使用 -p(密码)选项。出于演示目的,我将为用户 imoon 设置一个新密码 redhat。
[root@erpserver ~]# usermod -p redhat imoon
[root@erpserver ~]#
设置密码后,检查 shadow 文件,看密码是加密格式还是未加密格式。
[root@erpserver ~]# cat /etc/shadow | grep 'imoon'
imoon:redhat:20486:0:99999:7:::
[root@erpserver ~]#
注意:
密码对所有人都是明文可见的。因此,不推荐使用此选项,因为密码将对所有用户可见。
12. 更改用户Shell
用户登录Shell可以在创建用户时通过 useradd 命令定义,也可以通过 usermod 命令使用 -s(shell)选项进行更改。例如,用户 imoon 默认使用 /bin/bash shell,现在我想将其更改为 /bin/sh。
imoon:x:1004:1004::/var/imoon:/bin/bash
[root@erpserver ~]# usermod -s /bin/sh imoon
[root@erpserver ~]#
更改用户Shell后,使用以下命令验证。
[root@erpserver ~]# grep -E 'imoon' /etc/passwd
imoon:x:1004:1004::/var/imoon:/bin/sh
[root@erpserver ~]#
13. 更改用户ID(UID)
使用 -u(uid)选项更改用户 imoon 的 UID,并验证更改。
[root@erpserver ~]# usermod -u 1099 imoon
[root@erpserver ~]# id imoon
uid=1099(imoon) gid=1004(imoon) 组=1004(imoon)
[root@erpserver ~]#
14. 使用多个选项修改用户账户
这里有一个用户 webadmin,现在我想通过一条命令,使用上面讨论的所有选项,一次性修改他的家目录、Shell、过期日期、注释、UID 和组。
用户 webadmin 的默认家目录是 /home/webadmin,现在我想将其更改为 /var/www/html,分配他的 Shell 为 bash,设置过期日期为 2026年12月31日,添加新注释“web administrator”,将 UID 更改为 2000,并使他成为 webs 组的成员。
现在让我们看看如何使用多个选项修改 webadmin 账户。
[root@erpserver ~]# usermod -d /var/www/html/ -s /bin/bash -e 2026-12-31 -c "web administrator" -u 2000 -aG webs webadmin
[root@erpserver ~]#
然后检查 UID 和家目录的更改。
[root@erpserver ~]# grep -E 'webadmin' /etc/passwd
webadmin:x:2000:1100:web administrator:/var/www/html/:/bin/bash
检查账户过期。
[root@erpserver ~]# chage -l webadmin
最近一次密码修改时间 :2月 02, 2026
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :12月 31, 2026
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
[root@erpserver ~]#
检查 webadmin 所属的所有组。
[root@erpserver ~]# grep -E 'webadmin' /etc/group
webadmin:x:1100:
webs:x:1101:webadmin
15. 同时更改用户的UID和主GID
可以同时更改用户的 UID 和主 GID。
现在将 imoon 用户账户的 UID 设置为 2026,主 GID 设置为 webadmin 组 (1100)。
先检查修改前的 UID 和 GID。
[root@erpserver ~]# id imoon
uid=1004(imoon) gid=1004(imoon) 组=1004(imoon)
[root@erpserver ~]#
修改 UID 和 GID。
[root@erpserver ~]# usermod -u 2026 -g 1100 imoon
检查更改。
[root@erpserver ~]# id imoon
uid=2026(imoon) gid=1100(webadmin) 组=1100(webadmin)