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