linux用户与用户组管理
1.linux用户管理
1.1 用户基础
-
linux的用户主要有如下作用:
- linux是一个多用户的操作系统,同一时间可以允许多个用户使用操作系统,处理不同事物。
- linux系统上的每个进程,都需要一个特定的额用户运行。
- 通常我们使用普通用户管理服务器,而非root用户。
-
用户的分类
每个用户在系统中都有一个ID与之对应,用于linux系统区分不同的用户,这个ID称为UID。
UID的为一个无符号的整数值,范围是0-65535。
系统中的用户分为以下几类(以centos 7为例):
UID 用户类型及作用 0 root,超级用户,拥有系统最高权限,注意:只要UID为0,则为超级用户。 1-200 系统用户,用于运行系统自带的程序,默认已经创建。 201-999 系统用户,用于运行用户安装的程序,一般无需登录系统,因此可将shell类型设置。为/sbin/nologin。 1000-65535 普通用户,一般分配给个人使用,可以登录系统,权限较小。 -
用户的家目录
一般每个普通用户在创建时会自动在/home下创建一个同名的家目录,其权限为700。
家目录在创建时会自动复制/etc/skel目录下的全部内容到家目录下。
#家目录的权限 [root@xuzhichao ~]# ll -d /home/xu/ drwx------. 17 xu xu 4096 Nov 4 2020 /home/xu/ #/etc/skel内容 [root@xuzhichao ~]# ll -a /etc/skel/ total 24 drwxr-xr-x. 3 root root 78 Nov 4 2020 . drwxr-xr-x. 138 root root 8192 May 28 19:25 .. -rw-r--r--. 1 root root 18 Apr 1 2020 .bash_logout -rw-r--r--. 1 root root 193 Apr 1 2020 .bash_profile -rw-r--r--. 1 root root 231 Apr 1 2020 .bashrc drwxr-xr-x. 4 root root 39 Nov 4 2020 .mozilla
- 当需要手动创建用户家目录时,可按照如下步骤操作:
#步骤一:创建700的用户目录 [root@xuzhichao ~]# cd /home/ [root@xuzhichao home]# mkdir 700 /home/wang #步骤二:复制/etc/skel下的内容到家目录下 [root@xuzhichao home]# cp -r /etc/skel/.[^.]* /home/wang/ #步骤三:修改家目录及所属文件的属主数组 [root@xuzhichao home]# chown wang:wang -R /home/wang/
1.2 /etc/passwd:用户信息文件
/etc/passwd文件用于记录所有用户的相关信息,文件内容如下:
[root@xuzhichao ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
......
/etc/passwd文件以冒号“:”为分隔符,分为7个字段,各个字段的意义如下:
字段 | 意义 |
---|---|
root | 用户名 |
x | 用户密码,目前密码相关信息移到了/etc/shadow文件中 |
0 | UID,每个用户都有一个唯一的UID值。 |
0 | GID,用户所属组的id值 |
root | 用户的描述信息 |
/root | 用户的家目录,每个普通用户创建时会自动在/home下创建一个同名的家目录。 |
/bin/bash | 用户默认的shell类型 |
1.3 /etc/shadow:用户密码信息文件
/etc/shadow文件用于记录每个用户的密码及密码的相关属性信息,一般与用户文件一一对应,文件内容如下:
[root@xuzhichao home]# cat /etc/shadow
root:$6$7FogQXhseo4ZNCvh$eyfPQhkWfjjIFkf4u3pfm5OYtZLQzsxHMsXkov6IKOGfppJmwLtZ11GSRszgk0o1IklDPsvXvEC8hXmi.32OL/::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
/etc/shadow文件共有8个字段,含义如下:
字段 | 意义 |
---|---|
root | 用户名 |
$6$7FogQXh... | 用户密码的密文,使用$分隔为3部分,第一部分代表密码加密使用的单项加密算法,其中1代表md5算法,6代表SHA512算法;第二部分代表加密算法使用的随机因子,称为“salt”,该随机数会和用户密码一起运行加密算法成为最终的密文,sait的作用避免两个一样的密码,加密后的值时一样的;第三部分则代表用户的密码密文,如果在密码前面有一个“!”表示该用户被锁定,无法登录系统,“*”则代表用户无密码,无密码的用户无法登录系统。 |
第三字段 | 表示从1970年1月1日那天算起,到修改密码的那天所经过的天数 |
0 | 表示再次修改密码需要经过的天数,即修改密码的最短时间,0表示可以随时修改密码 |
99999 | 表示再过多少天密码到期,即密码的最长使用时间 |
7 | 表示密码到期前多少天发送提示信息,即密码到期的7天前开始给用户发送提示信息,说明密码即将过期,要求用户修改密码 |
第7字段 | 表示密码过期后的的宽限时间,此时间内用户仍然可以登录系统,超过此时间,用户将无法登录系统 |
第8字段 | 表示用户过期日,即从1970年1月1日算起,多少天后此用户永久失效 |
1.4 用户查看工具
1.4.1 getent命令详解
getent可以用来查看/etc/passwd /etc/group /etc/shadow /etc/gshadow文件内容,并且可以过滤用户。
#示例:
[root@xuzhichao home]# getent passwd xu
xu:x:1000:1000:xu:/home/xu:/bin/bash
[root@xuzhichao home]# getent passwd xu root
xu:x:1000:1000:xu:/home/xu:/bin/bash
root:x:0:0:root:/root:/bin/bash
[root@xuzhichao home]# getent shadow xu
xu:$6$cn3f4OABrnCmWjJx$A12PX2F5FBhCpd/icRMJi2kGTFp3bwJDNqlj3hXvIS7gemPoSI/PpEhW3J/iNyI8FbzqhvoZBMCHy3XN5kek6/::0:99999:7:::
[root@xuzhichao home]# getent group xu
xu:x:1000:xu
[root@xuzhichao home]# getent gshadow xu
xu:!!::xu
1.4.2 id命令详解
id命令用于获取用户的uid和gid信息,常用选项如下:
选项 | 说明 |
---|---|
-u | 显示用户UID |
-g | 显示用户GID |
-G | 显示用户的主组和附加组的GID |
-n | 显示用户或组名称而非ID,配合ugG使用 |
id使用示例如下:
#示例一:查看xu用户的用户名和主组即附加组信息
[root@xuzhichao home]# id xu
uid=1000(xu) gid=1000(xu) groups=1000(xu),1004(xu1)
#示例二:单独查看用户的用户信息和组信息
[root@xuzhichao home]# id -u xu
1000
[root@xuzhichao home]# id -g xu
1000
[root@xuzhichao home]# id -G xu
1000 1004
[root@xuzhichao home]# id -Gn xu
xu xu1
[root@xuzhichao home]# id -un xu
xu
#示例三:使用id可判断用户是否存在
[root@xuzhichao ~]# id xu
uid=1000(xu) gid=1000(xu) groups=1000(xu)
[root@xuzhichao ~]# echo $?
0
[root@xuzhichao ~]# id aaa
id: aaa: no such user
[root@xuzhichao ~]# echo $?
1
1.4.3 finger和chfn命令详解
finger命令用户用于修改,查看用户描述信息。即/etc/passwd文件中的第5个字段信息。
#安装finger
[root@xuzhichao home]# yum install finger -y
#示例:
[root@xuzhichao home]# finger xu
Login: xu Name: xu
Directory: /home/xu Shell: /bin/bash
Last login Wed Nov 4 01:11 2020 (CST) on :0
No mail.
No Plan.
chfn命令用于修改用户的描述信息。
#示例:
[root@xuzhichao home]# chfn xu
Changing finger information for xu.
Name [xu]:
Office []: maipu
Office Phone []: 1010101
Home Phone []: 111111
Finger information changed.
[root@xuzhichao home]# finger xu
Login: xu Name: xu
Directory: /home/xu Shell: /bin/bash
Office: maipu, 101-0101 Home Phone: 111111
Last login Wed Nov 4 01:11 2020 (CST) on :0
No mail.
No Plan.
[root@xuzhichao home]# getent passwd xu
xu:x:1000:1000:xu,maipu,1010101,111111:/home/xu:/bin/bash
1.5 创建用户
1.5.1 useradd/adduser命令详解
useradd命令用于创建新的用户,一般由root用户来添加普通用户。
adduser命令则是useradd的一个软链接:
[root@xuzhichao home]# ll `which adduser`
lrwxrwxrwx. 1 root root 7 Nov 4 2020 /usr/sbin/adduser -> useradd
useradd命令的语法如下:
useradd [options] LOGIN
useradd命令的常用选项如下:
选项 | 说明 |
---|---|
-u UID | 指定创建用户的UID |
-o | 配合-u选项,不检查UID的唯一性 |
-g GID | 指明用户所属的基本组,可为组的名称,也可以是GID |
-c | 指明用户的注释信息 |
-d | 指定用户的家目录 |
-s | 指定用户的默认shell类型,可用列表在/etc/shells文件中 |
-G | 指定用户的附加组,单独使用会覆盖用户的原有附加组 |
-N | 不创建与用户同名的私有组做主组,使用共用的users组为主组 |
-r | 创建系统用户,默认不会创建家目录和邮箱 |
-m | 创建家目录,一般用于系统用户 |
-M | 不创建家目录,一般用于非系统用户 |
-D | 显示或更改用户的默认设置 |
-f | 指定用户的inactive时间,0表示用户立即过期,-1表示永不过期 |
useradd在创建用户时会有一些默认的配置,这些配置都是在配置文件中定义的,两个配置文件如下:
-
/etc/default/useradd
[root@xuzhichao home]# cat /etc/default/useradd # useradd defaults file GROUP=100 <==在useradd使用-N或/etc/login.defs中 USERGROUPS_ENAB=yes时表示创建用户时不创建用户同名的组,而是使用此处指定的组作为用户主组 HOME=/home <==用户家目录都创建在/home文件中 INACTIVE=-1 <==是否启用账号过期设置,-1表示不启用 EXPIRE= <==账号过期时间,不设置表示不表示 SHELL=/bin/bash <==新建用户默认的shell类型 SKEL=/etc/skel <==指定用户家目录的模板目录,新建用户时会自动复制此目录下的内容到用户家目录中 CREATE_MAIL_SPOOL=yes <==是否创建用户的mail文件
-
/etc/login.defs
[root@xuzhichao home]# cat /etc/login.defs MAIL_DIR /var/spool/mail <==用户的邮件目录 PASS_MAX_DAYS 99999 <==指定密码的最大使用时间 PASS_MIN_DAYS 0 <==指定密码的最小使用时间 PASS_MIN_LEN 5 <==指定密码的最小长度 PASS_WARN_AGE 7 <==指定密码到期前的告警时间 # Min/max values for automatic uid selection in useradd UID_MIN 1000 <==自动创建用户时最小的UID值 UID_MAX 60000 <==自动创建用户时最大的UID值 # System accounts SYS_UID_MIN 201 <==系统用户的最小UID SYS_UID_MAX 999 <==系统用户的最大UID # Min/max values for automatic gid selection in groupadd GID_MIN 1000 <==普通用户的最小GID GID_MAX 60000 <==普通用户的最大GID # System accounts SYS_GID_MIN 201 <==系统用户的最小GID SYS_GID_MAX 999 <==系统用户的最大GID # If useradd should create home directories for users by default # On RH systems, we do. This option is overridden with the -m flag on # useradd command line. CREATE_HOME yes <==创建用户时默认创建家目录 # The permission mask is initialized to this value. If not specified, # the permission mask will be initialized to 022. UMASK 077 <==家目录的默认umsak值 # This enables userdel to remove user groups if no members exist. USERGROUPS_ENAB yes <==yes表示删除用户时,如果该用户的主组中没有其他用户,则一起删除 这个组 # Use SHA512 to encrypt password. ENCRYPT_METHOD SHA512 <==表示用户的密码信息摘要算法
-
useradd的-D选项用于查看和修改以上两个文件内容
[root@xuzhichao home]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes #修改新创建用户的默认shell类型 [root@xuzhichao home]# useradd -D -s /bin/csh [root@xuzhichao home]# useradd -D GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/csh SKEL=/etc/skel CREATE_MAIL_SPOOL=yes [root@xuzhichao home]# useradd -D -s /bin/bash
useradd命令的示例如下:
#示例一:使用默认参数创建用户
[root@xuzhichao home]# useradd xu1
[root@xuzhichao home]# getent passwd xu1
xu1:x:1004:1004::/home/xu1:/bin/bash
#示例二:创建mysql用户,使用uid为336,家目录为/data/mysql,shell为/sbin/nologin,主组为mysql,附加组为root,wheel,同时创建为系统用户,不创建默认的家目录
[root@xuzhichao home]# useradd -u 336 -d /data/mysql -s /sbin/nologin -g mysql -G root,wheel -M -r mysql
#示例三:使用-N选项创建用户时不会创建同名组,会使用gid为100的组作为主组
[root@xuzhichao ~]# useradd -N xu3
[root@xuzhichao ~]# id xu3
uid=1009(xu3) gid=100(users) groups=100(users)
1.5.2 newusers命令 批量创建账号
newusers命令用法:
newusers filename
filename的格式与/etc/passwd的格式完全相同,只能批量创建用户,即在/etc/passwd中新建用户。不能创建密码。
#示例:
[root@xuzhichao ~]# cat passwd
a1:x:1006:1006::/home/a1:/bin/bash
a2:x:1007:1007::/home/a2:/bin/csh
a3:x:1008:1008::/home/a3:/bin/bash
[root@xuzhichao ~]# newusers passwd
[root@xuzhichao ~]# getent passwd a1 a2 a3
a1:x:1006:1006::/home/a1:/bin/bash
a2:x:1007:1007::/home/a2:/bin/csh
a3:x:1008:1008::/home/a3:/bin/bash
1.6 修改用户信息
1.6.1 usermod命令:修改用户信息
usermod命令用于修改用户的信息,语法如下:
usermod [options] LOGIN
usermod和useradd命令的选项很相似,常用选项说明如下:
选项 | 说明 |
---|---|
-u UID | 修改用户的UID |
-o | 允许用户使用重复的UID |
-g GID | 修改用户所属的主组 |
-c | 修改用户的注释信息,即/etc/passwd的第五个字段 |
-d | 修改用户的家目录,新家目录不会自动创建,若要创建新家目录并移动家目录中的数据,需要配合-m选项 |
-s | 修改用户的默认shell类型,可用列表在/etc/shells文件中 |
-G | 修改用户的附加组,单独使用会覆盖用户的原有附加组 |
-a | 配合-G选项使用,用于增加用户附加组,不会覆盖用户原有附加组 |
-m | 配合-d选项,移动家目录数据到新的家目录 |
-e | 设置账号有效期,即修改/etc/shadow的第8个字段,格式为YYYY-MM-DD |
-l | 修改用户名 |
-f | 修改用户的inactive时间,修改的是/etc/shadow文件的第7个字段,单位为天数,0表示用户立即过期,-1表示永不过期 |
-L | 锁定用户,即在用户密码前加!,用户将无法登录系统,但是可以通过su切换到改用户 |
-U | 解锁用户 |
usermod命令的使用示例如下:
#示例一:修改用户的uid
[root@xuzhichao ~]# useradd redis
[root@xuzhichao ~]# getent passwd redis
redis:x:1010:1010::/home/redis:/bin/bash
[root@xuzhichao ~]# usermod -u 1011 redis
[root@xuzhichao ~]# getent passwd redis
redis:x:1011:1010::/home/redis:/bin/bash
#示例二:修改用户的shell类型,当不需要用户登录系统时,可将其shell类型设置为/sbin/nologin
[root@xuzhichao ~]# usermod -s /sbin/nologin redis
[root@xuzhichao ~]# getent passwd redis
redis:x:1011:1010::/home/redis:/sbin/nologin
[root@xuzhichao ~]# su - redis
This account is currently not available.
#示例三:修改用户的描述信息
[root@xuzhichao ~]# usermod -c "redis" redis
[root@xuzhichao ~]# getent passwd redis
redis:x:1011:1010:redis:/home/redis:/sbin/nologin
#示例四:移动用户的家目录
[root@xuzhichao ~]# ls /home/redis/ -a
. .. .bash_logout .bash_profile .bashrc .mozilla
[root@xuzhichao ~]# usermod -m -d /data/redis redis
[root@xuzhichao ~]# ls -a /home/redis
ls: cannot access /home/redis: No such file or directory
[root@xuzhichao ~]# ls -a /data/redis/
. .. .bash_logout .bash_profile .bashrc .mozilla
#示例五:增加用户的附加组信息,注意:所有附加组需要提前存在
[root@xuzhichao home]# useradd xu2
[root@xuzhichao home]# id xu2
uid=1005(xu2) gid=1005(xu2) groups=1005(xu2)
[root@xuzhichao home]# usermod -G xu1 xu2
[root@xuzhichao home]# id xu2
uid=1005(xu2) gid=1005(xu2) groups=1005(xu2),1004(xu1)
[root@xuzhichao home]# usermod -a -G xu xu2
[root@xuzhichao home]# id xu2
uid=1005(xu2) gid=1005(xu2) groups=1005(xu2),1000(xu),1004(xu1)
#示例六:锁定与解锁用户,即在用户密码前加!
[root@xuzhichao ~]# echo 123456 | passwd --stdin redis
Changing password for user redis.
passwd: all authentication tokens updated successfully.
[root@xuzhichao ~]# getent shadow redis
redis:$6$RNZ2tyMm$ecGsvUThkAUmvaWCzAkcxgv1uW7EIZyRpH7tY1b6uHwXa8I2Di8OVOaBrLwn.Rg/mbbrjw/zCs5/0q3Ut9/mV.:18776:0:99999:7:::
[root@xuzhichao ~]# usermod -L redis
[root@xuzhichao ~]# getent shadow redis
redis:!$6$RNZ2tyMm$ecGsvUThkAUmvaWCzAkcxgv1uW7EIZyRpH7tY1b6uHwXa8I2Di8OVOaBrLwn.Rg/mbbrjw/zCs5/0q3Ut9/mV.:18776:0:99999:7:::
[root@xuzhichao ~]# usermod -U redis
[root@xuzhichao ~]# getent shadow redis
redis:$6$RNZ2tyMm$ecGsvUThkAUmvaWCzAkcxgv1uW7EIZyRpH7tY1b6uHwXa8I2Di8OVOaBrLwn.Rg/mbbrjw/zCs5/0q3Ut9/mV.:18776:0:99999:7:::
1.6.2 chsh命令:修改用户的shell类型
chsh命令专门用于修改用户的shell类型,语法格式为:
chsh [options] [username]
chsh的常用选项如下:
选项 | 说明 |
---|---|
-l | 列出系统中/etc/shells中的所有shell类型 |
-s | 为指定的用户修改shell类型,若不加用户,则修改当前用户的shell类型 |
chsh的使用示例如下:
#示例一:列出/etc/shells文件中的所有shell类型
[root@xuzhichao ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh
#示例二:修改用户的shell类型
[root@xuzhichao ~]# chsh -s /bin/sh
Changing shell for root.
Shell changed.
[root@xuzhichao ~]# chsh -s /bin/sh xu
Changing shell for xu.
Shell changed.
1.7 用户密码信息设定与修改
1.7.1 passwd命令:设定和修改用户密码信息
passwd命令用于设定用户密码,还可以设置/etc/shadow文件中的属性信息。
一般只有root用户可以修改用户的密码信息。
passwd命令的语法格式为:
passwd [OPTION...] <accountName>
passwd命令的常用选项如下:
选项 | 说明 |
---|---|
-l | 锁定用户,和usermod的-L选项意义相同 |
-u | 解锁用户 |
-e | 修改/etc/shadow文件的第三个字段为0,表示用户登录时要求立即修改密码,对su方式无效 |
-n | 修改/etc/shadow文件的第四个字段,即密码的最短使用天数 |
-x | 修改/etc/shadow文件的第五个字段,即密码的最长使用天数 |
-w | 修改/etc/shadow文件的第六个字段,即密码过期前的警告天数 |
-i | 修改/etc/shadow文件的第七个字段,即密码过期后的宽限时间 |
-S | 显示用户密码的相关信息 |
--stdin | 使用管道时传入用户密码,多用于脚本中设置密码 |
passwd命令直接跟上用户名表示交互式的设定或修改用户的密码信息,不加用户表示修改当前用户的密码信息。
#示例一:修改用户xu的密码
[root@xuzhichao ~]# passwd xu
Changing password for user xu.
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
Retype new password:
passwd: all authentication tokens updated successfully.
#示例二:修改root的密码
[root@xuzhichao ~]# passwd
Changing password for user root.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
passwd也可以不进行交互直接设定或修改用户信息,使用参数--stdin即可,示例如下:
[root@xuzhichao ~]# echo "12345678" | passwd --stdin xu
Changing password for user xu.
passwd: all authentication tokens updated successfully.
passwd命令还可以修改用户的密码属性信息,示例如下:
#示例一:强制用户下次登录修改密码,实际就是把shadow文件的第三个字段修改为0
[root@xuzhichao ~]# passwd -e xu
Expiring password for user xu.
passwd: Success
[root@xuzhichao ~]# getent shadow xu
xu:$6$gcA1Hcoj$jMjJTycS5Ya4ZMiXsk.cZ4tzPGZ0uGZCACqX30GkYDLOmobkNBEQWVp21dR.Z7lS6qWv731SZMXKM7RqdeclB/:0:0:99999:7:::
#当xu用户重新登录时会有如下提示,修改完密码后系统会让xu用户重新登录系统
WARNING! The remote SSH server rejected X11 forwarding request.
You are required to change your password immediately (root enforced)
WARNING: Your password has expired.
You must change your password now and login again!
Changing password for user xu.
Changing password for xu.
(current) UNIX password:
New password:
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
#示例二:锁定和解锁用户,即在用户密码前加!
[root@xuzhichao ~]# passwd -l xu
Locking password for user xu.
passwd: Success
[root@xuzhichao ~]# getent shadow xu
xu:!!$6$gcA1Hcoj$jMjJTycS5Ya4ZMiXsk.cZ4tzPGZ0uGZCACqX30GkYDLOmobkNBEQWVp21dR.Z7lS6qWv731SZMXKM7RqdeclB/:0:0:99999:7:::
[root@xuzhichao ~]# passwd -u xu
Unlocking password for user xu.
passwd: Success
[root@xuzhichao ~]# getent shadow xu
xu:$6$gcA1Hcoj$jMjJTycS5Ya4ZMiXsk.cZ4tzPGZ0uGZCACqX30GkYDLOmobkNBEQWVp21dR.Z7lS6qWv731SZMXKM7RqdeclB/:0:0:99999:7:::
#示例三:修改xu用户的密码到期前的警告天数
[root@xuzhichao ~]# passwd -w 10 xu
Adjusting aging data for user xu.
passwd: Success
[root@xuzhichao ~]# getent shadow xu
xu:$6$gcA1Hcoj$jMjJTycS5Ya4ZMiXsk.cZ4tzPGZ0uGZCACqX30GkYDLOmobkNBEQWVp21dR.Z7lS6qWv731SZMXKM7RqdeclB/:0:0:99999:10:::
#示例四:查看用户的密码信息
[root@xuzhichao ~]# passwd -S xu
xu PS 1970-01-01 0 99999 10 -1 (Password set, SHA512 crypt.)
1.7.2 chage命令:修改用户密码属性
chage命令和passwd命令一样,也可以修改用户密码文件的信息,语法格式为:
chage [options] LOGIN
chage命令的常用选项如下:
选项 | 说明 |
---|---|
-d | 修改/etc/shadow文件的第三个字段,格式为YYYY-MM-DD |
-m | 修改/etc/shadow文件的第四个字段,即密码的最短使用天数 |
-M | 修改/etc/shadow文件的第五个字段,即密码的最长使用天数 |
-W | 修改/etc/shadow文件的第六个字段,即密码过期前的警告天数 |
-I (大写i) | 修改/etc/shadow文件的第七个字段,即密码过期后的宽限时间 |
-E | 修改/etc/shadow文件的第八个字段,即密码失效日期,格式为YYYY-MM-DD |
-l | 显示用户密码的相关信息 |
chage命令可以直接修改用户的密码属性:
#示例:
[root@xuzhichao ~]# getent shadow xu1
xu1:$6$EB/nFz7N$BN/hGAmmsfXQhM9gcSO5/zoeh2PgAp4aIX.5fiLFFduePgJeTNmOpYYaJow9JAozn3o1HhWh.Z5A//gq9PA/w/:18776:0:99999:7:::
[root@xuzhichao ~]# chage xu1
Changing the aging information for xu1
Enter the new value, or press ENTER for the default
Minimum Password Age [0]: 1
Maximum Password Age [99999]: 30
Last Password Change (YYYY-MM-DD) [2021-05-29]: 2021-01-01
Password Expiration Warning [7]: 10
Password Inactive [-1]: 7
Account Expiration Date (YYYY-MM-DD) [-1]: 2022-01-01
[root@xuzhichao ~]# chage -l xu1
Last password change : Jan 01, 2021
Password expires : Jan 31, 2021
Password inactive : Feb 07, 2021
Account expires : Jan 01, 2022
Minimum number of days between password change : 1
Maximum number of days between password change : 30
Number of days of warning before password expires : 10
chage命令的其他选项示例如下:
#示例一:强制xu1用户下次登录立即修改密码,同passwd -e选项
[root@xuzhichao ~]# chage -d 0 xu1
#示例二:修改用户的失效日期
[root@xuzhichao ~]# chage -E 2023-01-01 xu1
[root@xuzhichao ~]# chage -l xu1
Last password change : password must be changed
Password expires : password must be changed
Password inactive : password must be changed
Account expires : Jan 01, 2023
Minimum number of days between password change : 1
Maximum number of days between password change : 30
Number of days of warning before password expires : 10
1.7.3 chpasswd命令 批量修改用户密码
chpasswd命令会从系统的标准输入读取用户的名称和口令,并利用这些信息来更新已存在的用户的口令
chpasswd命令语法格式为:
1:echo 用户名:密码 | chpasswd
2:chpasswd < passwd.txt
chpasswd命令的注意事项 :
- 用户名必须是系统上已存在的用户
- 普通用户没有使用这个指令的权限
- 如果输入文件是按非加密方式传递的话,请对该文件进行适当的加密。
- 指令文件不能有空行
chpasswd命令的使用示例如下:
#示例一:修改xu1的密码
[root@xuzhichao ~]# echo xu1:123456 | chpasswd
#示例二:批量修改用户密码
#创建密码文件
[root@xuzhichao ~]# cat chpasswd.txt
xu2:123456
xu3:123456
xu4:123456
xu5:123456
xu6:123456
#批量创建用户
[root@xuzhichao ~]# for i in {2..6} ;do useradd xu$i ;done
#批量修改用户密码
[root@xuzhichao ~]# chpasswd < chpasswd.txt
[root@xuzhichao ~]# getent shadow xu2 xu3 xu4 xu5 xu6
xu2:$6$Hv9ZU/A9WIa/fUwF$JMd/UJI.EurF7bfaX7micSe1mnZe9r8vrvuRVTETXvlMg3EtauvcEaIIODKkFIdigSGfr6I2iyJvrvSASX/Ev1:18776:0:99999:7:::
xu3:$6$7bJOMpw35H/yG$xjx8awE32OApQzs6q4.JKHpcX4nF05XqXpZdIct9WJZ7LX4Tcl/JFnCTGTmNwqI2/SDYB0YPVdW9/I4I8uZHU.:18776:0:99999:7:::
xu4:$6$HdUR3/6LtWW/$o0Pa4KON/W429thbKpsJJxZ6ndss6IOkXYEhWIc7cTxZnBxm8xaEUMfwsUZDdqSQi/ooTf2619x/kdF5jELTk1:18776:0:99999:7:::
xu5:$6$EYBYc1qL$kRah4B7aoXVmMYzNCp6Vw8QwG/2B0OqPG6xqZ6KTJCFRHhP5tJYzfmrcYoyE3DTCK/y/uc8RMudgne6cPRz3i/:18776:0:99999:7:::
xu6:$6$8bB2n/nT.ZZnI1$oGx1Z4Lcw2H9R4DIURUEl0oDqXkNFWyFAA4FapXGI63SkPk6Aiiuz8ylVq4fPr2tEggrbpJZdNGarNCy.X.wR0:18776:0:99999:7:::
1.8 删除用户
删除用户使用userdel命令,语法格式为:
userdel [options] LOGIN
userde命令l的常用选项如下:
选项 | 说明 |
---|---|
-r | 删除用户的连同用户的家目录和邮箱目录一同删除 |
userdel命令的使用示例如下:
#示例:
[root@xuzhichao ~]# userdel -r xu1
2.linux用户组管理
当用户众多时,可以将用户根据权限的不同加以分类后,将同一类账号加入一个组中,使之成为组的成员,这样对组进行授权时,组成员也就具有了相同的权限,极大提高了工作效率。
和用户一样,每个组也有一个ID用于系统识别该组,称为GID。
GID的范围和UID一样,为0-65535,其中1-999为系统用户组,999以上为普通用户组,0为超级用户组。
注意:当把一个账号新加入一个组中时,若该用户正处于登陆状态,则此时该用户并没有成功加入该用户组,需要用户重新登录时生效。
2.1 /etc/group:用户组文件
/etc/group文件用于存放用户组的相关信息,内容如下:
[root@xuzhichao ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
tty:x:5:
/etc/group文件共有4个字段,意义如下:
字段 | 说明 |
---|---|
root | 代表用户组名称 |
x | 用户组密码,具体密码信息放置在/etc/gshadow文件中 |
0 | 未用户组ID,即GID |
第四个字段 | 附加组为此组的用户列表,主组为此组的成员不会显示,多个用户之间使用逗号隔开 |
2.2 /etc/gshadow:用户组密码文件
/etc/gshadow文件用于存放组密码的相关信息,内容如下:
[root@xuzhichao ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
/etc/gshadow文件共有4个字段,意义如下:
字段 | 说明 |
---|---|
root | 用户组名称 |
第二字段 | 组管理密码 |
第三字段 | 该组的组管理员用户账号,多个账号之间用逗号隔开 |
第四字段 | 附加组为此组的用户列表,主组为此组的成员不会显示,多个用户之间使用逗号隔开 |
创建组管理员和组密码后,可以让组管理员对组成员进行管理。
2.3 用户组类别
-
用户组共有以下几类:
- 默认组:创建用户时不指定组,则默认创建一个与用户同名的组;
- 基本组:用户有且只有一个基本组,创建时使用-g指定;
- 附加组:用户可以由多个附加组,创建时使用-G指定;
-
用户组还有初始用户组和有效用户组的概念:
- 初始用户组:用户登录系统就会立即取得这个用户组的相关权限;
- 有效用户组:即为用户当前生效的用户组,用户创建文件时文件的属组则是用户的有效用户组;
-
groups命令:用于查看用户所有支持的组,使用示例如下:
#把xu用户加入用户组xu1,xu2中作为其附加组 [root@xuzhichao ~]# usermod -G xu1,xu2 xu [root@xuzhichao ~]# id xu uid=1000(xu) gid=1000(xu) groups=1000(xu),1012(xu1),1013(xu2) #把xu加入xu1和xu2组后,在/etc/group中xu1和xu2组的附加组成员中就会出现xu用户 [root@xuzhichao ~]# getent group xu1 xu2 xu1:x:1012:xu xu2:x:1013:xu #查看xu用户的所有支持的组,其中第一个组就是用户的有效用户组,用户创建文件时文件的属组则是用户的有效用户组 [root@xuzhichao ~]# groups xu xu : xu xu1 xu2 [xu@xuzhichao ~]$ touch abc [xu@xuzhichao ~]$ ll abc -rw-rw-r-- 1 xu xu 0 May 30 14:48 abc
-
newgrp命令:用于临时切换用户的有效用户组,切换的用户组需要是用户已经支持的用户组。
注意:newgrp命令切换用户组是新开启一个shell来实现的,使用exit可以退回用户原来的组中
#示例:切换xu用户的有效用户组为xu1 [xu@xuzhichao ~]$ newgrp xu1 [xu@xuzhichao ~]$ groups xu1 xu xu2 [xu@xuzhichao ~]$ touch abc1 [xu@xuzhichao ~]$ ll abc1 rw-r--r-- 1 xu xu1 0 May 30 14:54 abc1 #退回用户原来的用户组中 [xu@xuzhichao ~]$ exit exit [xu@xuzhichao ~]$ groups xu xu1 xu2
2.4 groupadd命令:创建用户组
groupadd命令用于创建用户组,语法格式为:
groupadd [options] GROUP
groupadd命令的常用选项如下:
选项 | 说明 |
---|---|
-g | 指定创建组的GID |
-r | 创建系统组 |
-f | 当创建的组已经存在时,不会报错,会返回成功 |
-o | 允许GID相同的组存在 |
groupadd命令的使用示例如下:
#示例一:创建gid为400的系统用户组
[root@xuzhichao ~]# groupadd -g 400 -r mygrp
[root@xuzhichao ~]# getent group mygrp
mygrp:x:400:
#示例二:
root@xuzhichao ~]# groupadd -f xu
[root@xuzhichao ~]# echo $?
0
2.5 修改用户组信息
2.5.1 groupmod命令:修改用户组信息
groupmod命令的语法格式为:
groupmod [options] GROUP
groupmod命令的常用选项如下:
选项 | 说明 |
---|---|
-g | 修改GID |
-n | 修改组名 |
-o | 允许GID相同的组存在 |
groupmod命令的使用示例如下:
#示例:修改组的组名和gid
[root@xuzhichao ~]# groupmod -g 401 -n mygroup mygrp
[root@xuzhichao ~]# getent group mygroup
mygroup:x:401:
2.5.2 groupmems命令:组成员管理
groupmems命令用于管理组的成员,管理的是以附加组加入的组成员,语法格式为:
groupmems [options] [action]
groupmems命令常见选项如下:
选项 | 说明 |
---|---|
-g | 指定要修改的组名 |
-a | 向指定组中增加成员 |
-d | 向指定组中删除成员 |
-l | 列出组成员列表 |
-p | 清空所有用户 |
groupmems命令的示例如下:
#示例一:向xu组中增加用户
[root@xuzhichao ~]# getent group xu
xu:x:1000:
[root@xuzhichao ~]# groupmems -g xu -a xu1
[root@xuzhichao ~]# groupmems -g xu -a xu2
[root@xuzhichao ~]# getent group xu
xu:x:1000:xu1,xu2
#删除xu组中的用户
[root@xuzhichao ~]# groupmems -g xu -d xu2
[root@xuzhichao ~]# getent group xu
xu:x:1000:xu1
#查看以附加组加入xu组的用户
[root@xuzhichao ~]# groupmems -g xu -l
xu1
#清空xu组的成员
[root@xuzhichao ~]# groupmems -g xu -p
[root@xuzhichao ~]# groupmems -g xu -l
[root@xuzhichao ~]# getent group xu
xu:x:1000:
2.5.3 gpasswd命令:修改设置组密码
gpasswd命令用于修改和设置组密码,使用组密码用户可以自行加组并设置该组为有效用户组,组管理员也可以自行将用户加入或剔除出组。
gpasswd命令的常见选项如下:
选项 | 说明 |
---|---|
-a | 添加用户到组中,组指的是附加组 |
-d | 将一个用户从组中删除 |
-r | 取消组密码 |
-A | 设置组管理员 |
-M | 设置组成员 |
gpasswd命令的用法示例:
#示例一:组密码的作用,用户自行加组
#为用户组设定密码
[root@xuzhichao ~]# getent gshadow xu
xu:!!::
[root@xuzhichao ~]# gpasswd xu
Changing the password for group xu
New Password:
Re-enter new password:
[root@xuzhichao ~]# getent gshadow xu
xu:$6$EMshnDxN4Wf5mfO$mgiwGrVH7tCMSduNDbOKX1htVPRhgGCRbo2Tneup57ZxdFIWEjYvX8eloNUVpjUVRoGCYsBi5BKv8624wQS9N/::
#用户自行加组为有效用户组,临时行为,用户并非永久加入用户组xu中
[root@xuzhichao ~]# su - xu1
-bash: colorscheme: command not found
[xu1@xuzhichao ~]$ groups
xu1
[xu1@xuzhichao ~]$ newgrp xu
Password:
bash: colorscheme: command not found
[xu1@xuzhichao ~]$ groups
xu xu1
[xu1@xuzhichao ~]$ id
uid=1017(xu1) gid=1000(xu) groups=1000(xu),1017(xu1)
#示例二:加入或删除组成员
[root@xuzhichao ~]# getent group xu
xu:x:1000:
[root@xuzhichao ~]# gpasswd -a xu1 xu
Adding user xu1 to group xu
[root@xuzhichao ~]# getent group xu
xu:x:1000:xu1
[root@xuzhichao ~]# gpasswd -d xu1 xu
Removing user xu1 from group xu
[root@xuzhichao ~]# getent group xu
xu:x:1000:
#示例三:设置组管理员
[root@xuzhichao ~]# gpasswd -A xu xu
[root@xuzhichao ~]# getent gshadow xu
xu:$6$EMshnDxN4Wf5mfO$mgiwGrVH7tCMSduNDbOKX1htVPRhgGCRbo2Tneup57ZxdFIWEjYvX8eloNUVpjUVRoGCYsBi5BKv8624wQS9N/:xu:
#使用xu用户加入和删除组成员
[root@xuzhichao ~]# su - xu
Last login: Sun May 30 14:48:22 CST 2021 on pts/2
-bash: colorscheme: command not found
[xu@xuzhichao ~]$ gpasswd -a xu1 xu
Adding user xu1 to group xu
[xu@xuzhichao ~]$ getent group xu
xu:x:1000:xu1
[xu@xuzhichao ~]$ gpasswd -d xu1 xu
Removing user xu1 from group xu
[xu@xuzhichao ~]$ getent group xu
xu:x:1000:
2.6 删除组
groupdel命令用户删除用户组。
注意:要删除的组不能是用户的主组,否则该组无法删除。
groupdel命令的语法格式为:
groupdel [options] GROUP
groupdel命令的使用示例:
#示例一:删除组xu1,因为xu1用户的主组为xu1,因此无法删除该组,除非先删除xu1用户或修改xu1的主组,才能删除该组
[root@xuzhichao ~]# groupdel xu1
groupdel: cannot remove the primary group of user ‘xu1‘
[root@xuzhichao ~]# usermod -g xu xu1
[root@xuzhichao ~]# groupdel xu1 <==删除成功
2.7 管理用户和组的配置文件
2.7.1 vipw和vigr命令的使用
vipw和vigr命令用于编辑/etc/passwd和/etc/group文件,并且可以检查文件中语法是否错误。
vipw -s 用于编辑/etc/shadow文件;
vigr -s用于编辑/etc/gshadow文件;
#示例:
[root@xuzhichao ~]# vipw
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
......
You have modified /etc/passwd.
You may need to modify /etc/shadow for consistency.
Please use the command ‘vipw -s‘ to do so.
2.7.2 pwck和grpck命令检查配置文件
pwck和grpck命令用于检测/etc/passwd和/etc/group文件的格式和一致性。
#示例:
[root@xuzhichao ~]# pwck
user ‘ftp‘: directory ‘/var/ftp‘ does not exist
user ‘pulse‘: directory ‘/var/run/pulse‘ does not exist
user ‘gluster‘: directory ‘/run/gluster‘ does not exist
invalid password file entry
delete line ‘xu10‘? y
invalid password file entry
delete line ‘‘? y
pwck: the files have been updated
[root@xuzhichao ~]# grpck
invalid group file entry
delete line ‘a‘? y
grpck: the files have been updated