1.用户信息文件

Linux系统中每一个用户都有一个唯一的用户编号和这个用户对应,我们将这个编号称为用户标识符UID(User IDentifier)。UID在linux中是内核用来辨识用户的一个无符号整型数值。
需要注意的是,在LInux中区分不用的用户,就是用UID实现的,而非用户名。每个登录用户的基本信息都保存在/etc/passwd文件中,每一行存放对应一个用户的信息。

查看/etc/passwd内容

[root@test ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
....

上例中每一行代表一个用户的相关信息,从左往右一共有7个字段,均用冒号分隔开。具体含义如下:


说明

1

用户名,即用户登录系统的名称

2

早期Unix上曾经存放过用户的密码,后来基于安全考虑,密码转移到了/etc/shadow中,此处x表示此用户的密码从/etc/shadow获取

3

表示用户编号,即UID,默认root的UID是0,新创建的第一个用户默认UID是1000,后面的新建用户UID按1001,1002…次序分配

4

表示用户所属的主组的id号码,即GID

5

此处存放对于该用户的说明信息,比如姓名、部门、电话等等

6

此处表示用户的家目录,或者初始化工作目录,root家目录默认在/root,普通用户的家目录,默认在/home/username

7

代表用户默认使用的shell类型,root和普通用户默认使用的是/bin/bash

正是通过/etc/passwd文件,系统保存了用户相关的信息,可以将这个文件理解为一个系统的用户数据库。其中UID和GID的编号由系统自动分配的范围为0-65535。其中Centos6默认将1-499作为系统用户的UID,而 Centos7以上的版本中将1-999作为系统用的UID,剩下的UID则分配给普通用户使用。

系统用户帐号通常被一些应用程序使用,当一些应用程序运行时,会以系统用户的身份执行。而这些应用程序一般会随着计算机启动而自动运行,不需要用户登录后运行。所以系统用户shell类型 一般都是/sbin/nologin

在上文中提到了用户真正的密码内容都是存放在/etc/shadow文件中的,并且是密文,下面来分析一下该文件

[root@test ~]# cat /etc/shadow
root:$6$QLaZgJxiC$cs8uZcrdFAZrfn5LdQBoQynjmZcZOlJdFHPbBKf/wHqNK.a3wEQ0ap.0Df.WV9jnL.UN0UIh7p9jeaFKX5cyS1:18304:0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
...

如上示例中,shadow与passwd文件类似,都是一行代表一个用户的密码信息,每行中也使用8个冒号分隔出9个字段的内容,具体含义如下


说明

1

此处的用户名代表这行密码是属于/etc/passwd文件总对应的同名用户的密码信息

2

存放用户密码信息,这行内容同时又使用三个$符号分隔三字段。第一个字段代表加密使用的单向加密算法,使用数字表示,1代表MD5算法,6表示SHA512算法。第二个代表加密算法使用的随机因子,一般称为盐(salt),对密码加密是,使用salt,可以避免相同的密码,加密后值是一样的。salt和加密算法一起构成了密码最终的加密方式。第三个内容代表加密后最终结果,称为密文,由于是单向加密,根据加密算法和盐后是很难反向推导出密码的明文的,所以比较安全。如果是以"!"开头的密码字段 表示密码已被锁定

3

此处的数字,代表修改密码的日期时间,具体的数值表示1970年1月1号到修改密码那天的天数

4

在此修改密码需要经过的天数,如果是0代表随时可以修改密码

5

本次修改密码后,再过多少天后密码将过期

6

密码过期前发出提示消息的时间,7代表,在密码过期前7天开始,给用户发送提示消息,要求用户更改密码

7

密码过期后还可以继续使用的天数,超过此时间,用户将不可登录。此项为空,表示密码过期后,仍然可登录

8

从1970年1月1号到用户帐号被禁用的天数。在这个时间以后用户将不能登录,此项为空,表示此用户帐号永久有效

9

保留内容,为以后新增功能预留位置

2、用户组信息文件

实际工作中,当用户众多,可以将用户帐号根据权限的不同加以分类后,将同一类的一个或多个用户帐号加入到一个用户组中,使之成为组的成员。当对组分配相应的权限时,属于此组的用户将自动获取组的权限。当用户的分类很多时,不同类别的用户希望得到不同的权限,利用组可以大大减少分配权限的次数,提高工作效率。每个组也有一个唯一的编号与之对应,我们将这个组编号称之为GID。组和用户一样,也可以分为普通组和系统组,两者的区别和组类似,系统组的GID小于1000,普通组GID大于等于1000.

而用户组的相关信息保存在/etc/group文件中,这个文件记录着所有的用户组相关信息

查看/etc/group文件内容

[root@test ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
...

如上示例,和用户信息格式类似,依旧使用冒号分隔开,一共有4个字段内容,具体含义如下:


说明

1

组名称

2

代表组密码,x为占位符,具体密码的密文在/etc/gshadow文件中保存

3

代表组编号,即GID

4

代表用户,属于此附件组的用户列表,多个用户之间使用逗号进行分割

和用户信息一样,组信息中也有密码的设置,组密码的密文对应的存放于/etc/gshadow文件中

[root@test ~]# cat /etc/gshadow
root:::
bin:::
daemon:::
sys:::
....

gshadow文件的作用在于存放组的密码和组管理信息。将用户加入组只有超级用户root有权限实现。但如果用户知道组的密码,也可以通过newgrp命令加入到组中。该文件每一行代表一个组管理信息,每一行同样使用冒号进行分割,具体含义说明如下:


说明

1

组名称

2

组管理密码,以“!”开头的密码字段表示密码已被锁定

3

该管理组的管理员用户帐号,多个用户之间用逗号“,”分隔

4

属于此附加组的用户帐号列表,多个用户之间用逗号","分隔开

3、用户和用户组管理


3.1查看用户和用户组信息

除了使用cat与grep配合查看/etc/passwd等原文件外,还可以使用getent 查看用户数据库信息

#查看root用户信息

[root@test ~]# getent  passwd root
root:x:0:0:root:/root:/bin/bash

#查看root密码信息

[root@test ~]# getent shadow root
root:$6$QLaZgJxiC$cs8uZcrdFAZrfn5LdQBoQynjmZcZOlJdFHPbBKf/wHqNK.a3wEQ0ap.0Df.WV9jnL.UN0UIh7p9jeaFKX5cyS1:18304:0:99999:7:::

getent获取到的是原文件的原始数据,易读性较差,下面介绍几个易读性较好的命令

id命令可以获取用户的uid和gid信息

[root@test ~]# id root
uid=0(root) gid=0(root) groups=0(root

groups命令可以获取用户属于哪些组

[root@test ~]# groups root
root : root

finger 查看用户的详细信息

[root@test ~]# finger root
Login: root           			Name: root
Directory: /root                    	Shell: /bin/bash
On since Sun Mar  8 15:56 (CST) on pts/0 from 223.66.53.1
No mail.
No Plan.

3.2创建用户和用户组

userdd命令

此命令可用于创建用户

useradd [options] username

常用选项

选项

说明

-u UID

指定创建用户的UID

-o

配合-u选项,不检查UID的唯一性

-g GID

指明用户所属主要组,可为组的名称,也可以是GID

-c COMMENT

用户的注释信息

-d HOME_DIR

指定用户的家目录

-s SHELL

指明用户的默认shell程序,可用列表在/etc/shells文件中

-G GROUP1[,GROUP2,…]

为用户指明附加组,组须事先存在

-N

不创建和用户同名的私用组为主组

-r

创建系统用户

-m

创建家目录,一般用于系统用户

-M

不创建家目录,一般用于非系统用户

#创建用户test

[root@test ~]# useradd test
[root@test ~]# id test
uid=1000(test) gid=1000(test) groups=1000(test)

上例中,我们只是指定了用户名,其他内容均是默认生成的。创建用户的默认的配置,由/etc/default/useradd定义

[root@test ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100  #在useradd使用-N或/etc/login.defs中USERGROUPS_ENAB=no时 表示创建用户时不创建同用户名的主组,而使用此处的组作为主组
HOME=/home  #把用户的家目录建在/home中
INACTIVE=-1   #是否启用帐号过期设置,-1表示不启用
EXPIRE=    #帐号过期时间,不设置表示不启用
SHELL=/bin/bash     #新建用户默认的shell类型
SKEL=/etc/skel       #指定模版目录,新建用户时会自动复制此目录作为新建用户的家目录内容
CREATE_MAIL_SPOOL=yes   #是否创建用户mai文件

Note:/etc/login.defs存放创建新用户时和密码相关的默认信息

[root@test ~]# cat /etc/login.defs | grep -v "#"

MAIL_DIR	/var/spool/mail

PASS_MAX_DAYS	99999
PASS_MIN_DAYS	0
PASS_MIN_LEN	5
PASS_WARN_AGE	7

UID_MIN                  1000
UID_MAX                 60000
SYS_UID_MIN               201
SYS_UID_MAX               999

GID_MIN                  1000
GID_MAX                 60000
SYS_GID_MIN               201
SYS_GID_MAX               999


CREATE_HOME	yes

UMASK           077

USERGROUPS_ENAB yes    #删除用户时,如果该用户的主组中没有其他用户,则一起删除这个组。

ENCRYPT_METHOD SHA512    #表示用户密码的信息摘要算法

创建完普通用户后,一般要使用passwd命令给用户初始化一个密码

#查看刚刚创建的test帐号,由于没有密码,默认是被锁定状态,无法登陆

[root@test ~]# getent shadow test
test:!!:18329:0:99999:7:::

创建test用户密码

[root@test ~]# getent shadow test
test:!!:18329:0:99999:7:::
[root@test ~]# passwd test
Changing password for user test.
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@test ~]# getent shadow test
test:$6$2U17A.4A$vwOag4NXEtANdYZvI1ZTfYVgoTrpH85sHxFUQ7Pnc8zmppSGtn8zaep87hyLmVMTuYwe7t.21vDdtw49IZb4M0:18329:0:99999:7:::

Note:修改帐号密码

echo password | passwd --stdin username

使用useradd命令时,根据配置文件会默认给用户创建爱你一个和用户同名的组,并作为此用户的主要组。如果想要创建新的组,可以使用groupadd命令

groupadd 命令格式

groupadd [options] GROUP

groupadd命令常用选项

选项

说明

-f, --force

当组已经存在时,返回成功,使用此项将忽略-g选项

-g,–gid GID

制定创建组的GID

-h,–help

显示帮助

-K,–key KEY=VALUE

使用指定值,覆盖/etc/login.defs的默认值

-o,–non-unique

允许使用已存在的GID创建新的组

-p, --passwd PASSWORD

使用加密的密码

-r,–system

创建系统组

示例:
创建系统组 mysql,并制定其的GID为333

[root@test ~]# groupadd  -g 333 -o -r mysql
[root@test ~]# getent group mysql
mysql:x:333:

3.3 修改用户和用户信息

修改用户的信息,可以使用usermod命令实现

usermod命令语法格式:

usermod [options] username

usermod命令常用选项说明:

选项

说明

-c,–comment COMMENT

修改用户的描述信息,即修改/etc/passwd文件中第5个字段

-d, --home HOME_DIR

修改用户家目录

-e,–expiredate EXPIRE-DATE

设置帐号有效期,即修改/etc/shadow文件第8个字段,格式:YYYY-MM-DD

-f,–inactive INACTIVE

指定天数,即修改/etc/shadow文件第7个字段

-g,–gid GROUP

修改为指定主组

-G,–groups GROUPS

修改附属主组

-a,–append

配合-G选项,增加附属组

-h,–help

查看帮助

-l,–login NEW_LOGIN

修改用户名

-L,–lock

锁定用户

-m,–move-home

配合-d选项,移动家目录数据到新的家目录

-o,–non-unique

允许使用重复的UID

-p,–passwd PASSWD

使用加密的密码

-s,–shell SHELL

修改使用新的shell类型

-u,–uid UID

修改UID

-U,–unlock

解锁用户

示例

修改test用户的uid为1010

[root@test ~]# getent passwd test
test:x:1000:1000::/home/test:/bin/bash
[root@test ~]# usermod test -u 1010
[root@test ~]# getent passwd test
test:x:1010:1000::/home/test:/bin/bash

对于用户的密码信息,可以使用专门的密码修改命令passwd来处理,不指定用户时,修改当前登录用户的密码。除了修改密码内容外,passwd还可以修改shadow文件内的其他内容

passwd语法格式:

passwd [options] username

常用选项

选项

说明

–stdin

使用管道时传入密码的方式,常用于shell脚本

-l

同usermod命令的-L命令效果一样,在shadow的密码前加上叹号,即锁定

-u

同usermod命令的-U 命令效果一样,取消-l 命令添加的叹号,即解锁

-e

修改shadow第三个内容为0,用户登录时要求重置密码

-n

修改密码后多少天内不能修改,shadow文件的第4个内容

-x

修改密码的最长有效期的天数,shadow文件的第5个内容

-w

修改密码过期前警告的天数,shadow文件第6个内容

-i

修改密码失效后还可以使用的宽限时间,shadow文件第7个内容

-S

显示出用户的密码的相关信息

修改组信息的命令有很多,此处主要介绍groupmod命令

groupmod命令语法格式;

groupmod [options] GROUP

常用选项说明

选项

说明

-g,–gid GID

修改组的GID

-h,–help

查看帮助

-n,–new-name NEW GROUP

修改组名

-o,–non-unique

允许组的GID不唯一

-p,–password PASSWD

设置组的加密密码

示例

修改mysql组名为mysql1.gid为666

[root@test ~]# groupmod -g 666 -n mysql1 mysql
[root@test ~]# getent group mysql1
mysql1:x:666:

下面再介绍一个组管理的命令groupmems,此命令用来管理指定组的成员

groupmems命令语法格式:

groupmems [options] [action]

选项说明:

选项

说明

-g,–group groupname

指定要操作修改哪个组

-a,–add username

指定添加一个组的成员

-d,–delete username

指定删除一个组的成员

-l,–list

列出所有的组成员

-p,–purge

清空所有的用户

-h,–help

帮助

将testy用户,添加到mysql1这个组

[root@test ~]# groupmems  -g mysql1 -a test 
[root@test ~]# groupmems -l -g mysql1
test

3.4、删除用户和用户组

删除用户和组比较简单,直接使用userdel与groupdel 命令分别删除即可

删除test用户

-f:强制删除用户,即使用户当前已登录;
-r:删除用户的同时,删除与用户相关的所有文件
#将test用户的家目录及邮箱一起删除
[root@test ~]# userdel -r test

用户组删除,需要注意,如果要被删除的用户组是某个用户的主要组,则这个组不能够被删除

[root@test ~]# useradd aaa
[root@test ~]# getent group aaa
aaa:x:1000:
[root@test ~]# groupdel aaa
groupdel: cannot remove the primary group of user 'aaa'
---
[root@test ~]# groupdel mysql1

4、实战演练

1、创建组distro,其GID为2019

[root@test ~]# groupadd -g 2019 distro
[root@test ~]# getent group distro
distro:x:2019:

2、创建用户mandriva,其ID号为1005;基本组为distro

[root@test ~]# useradd -u 1005 -g distro mandriva

[root@test ~]# getent passwd mandriva
mandriva:x:1005:2019::/home/mandriva:/bin/bash

[root@test ~]# id mandriva
uid=1005(mandriva) gid=2019(distro) groups=2019(distro)

3、创建用户mageia,其ID号为1100,家目录为/home/linux

[root@test ~]# useradd -u 1100 -d /home/linux mageia

[root@test ~]# getent passwd mageia
mageia:x:1100:1100::/home/linux:/bin/bash

4、给用户mageia添加密码,密码为mageedu,并设置用户密码7天后过期

[root@test ~]# echo "mageedu" | passwd --stdin mageia
Changing password for user mageia.
passwd: all authentication tokens updated successfully.
[root@test ~]# passwd -x 7 mageia
Adjusting aging data for user mageia.
passwd: Success

5、删除mandriva,但保留其它目录

[root@test ~]# userdel mandriva
[root@test ~]# ll /home/mandriva
total 0
[root@test ~]# ll /home/
total 12
drwx------ 2 mageia mageia 4096 Mar  8 19:23 linux
drwx------ 2   1005 distro 4096 Mar  8 19:20 mandriva
drwx------ 2   1010   1000 4096 Mar  8 17:38 test

6、创建用户slackware,其ID号为2002,基本组为distro,附加组为peguin

[root@test ~]# groupadd peguin
[root@test ~]# useradd -u 2002 -g distro -G peguin slackware
[root@test ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin)

7、修改用户slackware的默认shell为/bin/tcsh

[root@test ~]# usermod -s /bin/tcsh slackware

[root@test ~]# getent passwd slackware
slackware:x:2002:2019::/home/slackware:/bin/tcsh

8、为用户slackware新增附加组admins

[root@test ~]# usermod -a -G admins slackware
[root@test ~]# id slackware
uid=2002(slackware) gid=2019(distro) groups=2019(distro),2020(peguin),2021(admins)

补充

1、显示/etc/目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录

[root@test ~]# ls  /etc/[^[:alpha:]][[:alpha:]]*
ls: cannot access /etc/[^[:alpha:]][[:alpha:]]*: No such file or directory
#查看etc下面都是以字母开头的文件
[root@test ~]# ll /etc/
total 1368
-rw-r--r--.  1 root root       18 Jul 11  2019 adjtime
-rw-r--r--.  1 root root     1518 Jun  7  2013 aliases
....

2、复制/etc/目录下所有以p开头的,以非数字结尾的文件或目录到/tmp/mytest1目录中

[root@test ~]# mkdir /tmp/mytest1
[root@test ~]# cp -a /etc/p*[^[:digit:]] /tmp/mytest1
[root@test ~]# ll /tmp/mytest1/
total 64
drwxr-xr-x.  2 root root 4096 Jul 11  2019 pam.d
-rw-r--r--   1 root root 1047 Mar  8 19:42 passwd
-rw-r--r--.  1 root root 1047 Mar  8 19:41 passwd-
drwxr-xr-x. 10 root root 4096 Jul 11  2019 pki
drwxr-xr-x.  2 root root 4096 Jul 11  2019 plymouth
drwxr-xr-x.  5 root root 4096 Jul 11  2019 pm
drwxr-xr-x.  2 root root 4096 Jun 10  2014 popt.d
drwxr-xr-x.  2 root root 4096 Jul 11  2019 postfix
drwxr-xr-x.  3 root root 4096 Jul 11  2019 ppp
drwxr-xr-x.  2 root root 4096 Jul 11  2019 prelink.conf.d
-rw-r--r--.  1 root root  233 Jun  7  2013 printcap
-rw-r--r--.  1 root root 1819 Oct 31  2018 profile
drwxr-xr-x.  2 root root 4096 Jul 11  2019 profile.d
-rw-r--r--.  1 root root 6545 Oct 31  2018 protocols
drwxr-xr-x.  2 root root 4096 Jul 11  2019 python

3、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中

[root@test ~]# cat /etc/issue
\S
Kernel \r on an \m
[root@test ~]# tr 'a-z' 'A-Z' < /etc/issue >/tmp/issue.out
[root@test ~]# cat /tmp/issue.out 
\S
KERNEL \R ON AN \M