一、用户信息文件 : /etc/passwd
首先我们可以使用命令man 5 passwd查看以下 passwd 文件的格式
我们看出 passwd 文件的格式是由七个字段组成,每个字段通过冒号分隔,并且每一行代表一个用户。下面我们将通过我个人的passwd文件作为模板,详细介绍每一个字段的含义。
第一字段 :用户名称(account)
这个字段没什么可说的,就是用户个人的用户名,不过,需要注意的是用户在起名时要遵守相应规范。
第二字段 :密码标识(password)
该字段若是 x ,则代表这个用户设有密码。x 不能省略,如果省略,系统在登录时就不会去 /etc/shadow 中搜索真正的密码,从而认为这个用户没有密码,于是直接登录,很不安全。
真正的密码并不存在于 passwd 文件,而是保存在/etc/shadow中,这里保存的只是一个密码标识。
第三字段 :UID
0 :表示该账户是超级用户
1~499 : 表示该账户是系统用户(伪用户)。专门用来为系统的启动服务或启动命令服务,一旦删除这些伪用户,系统会崩溃。
这些用户不能登录,其原因在于最后一个字段的 /sbin/nologin ,我们之后再谈。
500及以上 : 普通用户
当我们想把一个普通用户变为超级用户,只需把该用户的这个字段改为 0 ,这样,该用户便拥有了超级用户的权限。
注意 : 改变的只是该用户的权限,其家目录还是原来的位置。
第四字段 : GID(用户初始组ID)
初始组:指用户一登录就立刻拥有这个用户组的相关权限,每个用户都必须有一个初始组,并且初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。
附加组: 指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个
在 passwd 该字段下看到的 GID 是这个用户的初始组 GID,那么这个组到底指的是哪一个组呢?这时就需要匹配 /etc/group 文件,才能看到。我们不建议更改初始组,如果需要把用户添加到其他组中,请使用附加组。
第五字段 : 用户说明
该字段只是对本用户的一个备注说明,用户可以把一些重要信息保存在这里,方便日后的查看。
第六字段 : 家目录
普通户 : /home/用户名/
管理员 : /root/
第七字段 :登录之后的 shell
shell :命令解释器。我们需要通过 shell 才能与系统内核进行交流,shell有很多种,Linux 中的默认 shell 是 bash。
我们发现所有伪用户在这个字段是 /sbin/nologin , 我们知道 log in 是登录的意思,那么no log in就是禁止登陆,所以,所有的伪用户才无法登录。
也就是说,如果我把某一普通用户的这一字段由 /bin/bash 改为 /sbin/nologin ,该用户就会被禁用,无法登陆。
当然,如果粗心大意把这个字段的 shell 名字写错了,也会造成无法登陆的情况。
二 、影子文件 /etc/shadow
这个文件也是每一行代表一个用户,而且它与 passwd 文件的内容是对应的。shadow 下的每一行由冒号分隔的九个字段组成。
我们依然进行详细介绍。
第一字段 : 用户名
不赘述。
第二字段 : 加密密码
真正的密码就是保存在这一字段,这里是显示的加密后的密码。虽然经过加密,但我们还是不要轻易把这个文件传给别人,因为完全可以通过暴力**来从加密密码中得到真正的密码。
如果这一字段是两个感叹号 !!或者一个星号 * ,表示该用户没有设置密码,无法登录。
第三字段 : 密码最后一次的修改日期
该字段是用时间戳表示的。(以1970年1月1日为起始时间,每过一天加一,得出来的数字称为时间戳。)
如果我们想通过命令行对时间戳进行换算,可以用以下命令:
时间戳换算日期
date -d “1970-01-01 17066 days”
日期换算时间戳
echo $(($(date --date=”2018/01/01”+%s)/86400+1))
第四字段 : 两次密码的修改时间间隔
该字段所谓的间隔是与上一字段相比较的。
如果该字段是 0,则可在任意时刻修改该用户的密码。
假如该字段是 10 ,则要求 10 天内不允许用户修改密码。
第五字段 : 密码有效期
比如设置为30,则每隔30天必须改密码。如果到期,根据后面第六、第七字段来行动。
我这里的这一字段显示的是99999,是个相当长的时间,等同永远不会失效。
第六字段 :修改密码警告天数 n
当距离密码有效期(第五字段)还剩 n 天时,系统每天都会提醒你修改密码。
第七字段 :密码到期后的宽限天数
0:代表密码过期后立即失效
-1:代表密码永远不会失效
n :往后宽限 n 天
第八字段 :账号失效时间
要用时间戳表示。该账号到期立即失效。
第九字段 : 保留
三、组信息文件 /etc/group
该文件显示的是用户组的内容,有四个字段,每个字段的特性与前面的 passwd 和 shadow 的一些字段是相似的,所以这里简单介绍一下。
第一字段:组名
第二字段:组密码标志
与 passwd 中的第二字段特性相同,只是一个密码标志,真正的密码在 /etc/gshadow 中。只是我们通常不给组设置密码。
第三字段:GID
第四字段:组中附加用户
我们发现这个字段是空的,说明我们没有向其中添加其他用户。并且在这一字段,我们是看不到初始用户的,要想查看该组的初始用户,则要通过 GID 来与 passwd 文件对照查看。也许有人疑惑用户名和用户组名不是一样吗,何必特意去查看呢?因为这只是一般情况,有时候也会有人故意设置成不同的名字。
四、组密码文件 /etc/gshadow
该文件每行也是四个字段,group 和 gshadow 是两个对应的文件,但因为我们也很少用到它,所以这里也只是简述。
第一字段 : 组名
第二字段 : 组密码
第三字段 :组管理员的用户名
第四字段 : 组中附加用户
这四个字段我们从名字就可以了解其功能和特性,不在赘述。
五、用户管理的相关文件
关于用户,除了以上比较重要的四个配置文件,我们还需要了解一些其他相关文件。
1、家目录
在前文提到过,在这里温习一下。
普通用户: /home/用户名/,所有者和所属组都是此用户,权限是700
超级用户: /root/,所有者和所属组都是root用户,权限是550
2、用户的邮箱 : /var/spool/mail/用户名/
之后的学习会用到,这里先做一了解。
3、用户模板目录 : /etc/skel
这里解释一下什么叫模板目录。当我们添加一个新用户时,进入其家目录会发现是空的,但其实不然,这里面还有一些隐藏文件(见下图),这些文件自然不会是凭空出现,而是从某个地方复制过来的,这个地方就是模板目录。
所以,我们可以进入这个模板目录中,创建一个名为new的文件,这样,每次当我们添加新用户时,这个文件就会自动复制到该用户的家目录中。一般我们可以写一些警告或者注意事项在里面。
六、用户管理命令及探究
1、添加用户
useradd [选项] 用户名
-u UID : 手工指定用户的UID号
-d 家目录 : 手工指定用户的家目录
-c 用户说明 : 手工指定用户的说明
-g 组名 : 手工指定用户的初始组
-G 组名 : 指定用户的附加组
-s shell : 手工指定用户登录的shell,默认是 /bin/bash
接下来我们思考一下,在添加一个新用户时,系统都做了哪些操作呢?
由前面的配置文件我们知道,首先,它在passwd、shadow、group、gshadow中都添加了一行该用户及其用户组的信息,然后在 /home 下创建自己的家目录,并且从模板目录 /etc/skel 中复制文件到其家目录,在 /var/spool/mail 中建立自己的邮箱。
我们其实可以通过手动更改这些文件达到添加用户的目的,不过有点繁琐罢了。
另外在我们创建新用户时,许多值都是系统默认的,这些值大多被保存在以下两个配置文件中。
第一个是 /etc/default/useradd
GROUP=100 用户默认组(公有模式,我们用的是私人模式,所以不同)
HOME=/home 用户家目录
INACTIVE=-1 密码过期宽限天数
EXPIRE= 密码失效时间
SHELL=/bin/bash 默认shell
SKEL=/etc/skel 模板目录
CREATE_MAIL_SPOLL=yes 是否建立邮箱
第二个是 /etc/login.defs
PASS_MAX_DAYS 99999 密码有效期
PASS_MIN_DAYS 0 密码修改间隔
PASS_MIN_LEN 5 密码最小位数(由于太简单了,所以这里未生效,真正的位数定义在别的地方)
PASS_WARN_AGE 7 密码到期时间
UID MIN 500 最小和最大UID范围
UID_MAX 60000
GID MIN 500 最小和最大GID范围
GID_MAX 60000
2、更改密码
passwd [选项] 用户名
-S 查询用户的密码状态 (root权限)
-l (小写 L) 锁定用户(实际上是在shadow中的加密密码字段前加了两个感叹号, root权限)
-u 解锁用户 (root权限)
--stdin 可通过管道符输出的数据作为用户的密码(echo “123” | passwd -–stdin 用户名)
我们之前在介绍shadow配置文件时,曾说过其第二字段加密密码,如果密码位是 !! 或 * 代表没有密码,不能登录。现在把这句更新一下,如果在该字段的加密密码前有感叹号,其效果也是一样的。这样用户无法登陆,也就达到了锁定用户的结果。这就是 passwd -l 锁定用户和 passwd -u 解锁用户的原理。(详见下图)
3、修改用户信息(针对已存在的用户)
usermod [选项] 用户名
-u 修改UID
-c 修改说明信息
-G 修改附加组
-L 锁定用户
(实际上是在 shadow 中的加密密码字段前加了一个感叹号,通过passwd锁定用户是加两个感叹号,其实作用都一样)
-U 解锁用户
4、更改用户密码状态
chage [选项] 用户名
-l (小写L) : 列出用户详细的密码状态
-d 日期 : 修改密码的最后一次的修改日期
-m 天数 : 两次密码修改间隔(shadow字段4)
-M 天数 :密码有效期(shadow字段5)
-w 天数 :密码过期前警告天数(shadow字段6)
-I 天数 : 密码过期后宽限天数(shadow字段7)
-E 日期 : 账号失效时间(shadow字段8)
实际上,这些命令都可以通过修改配置文件 shadow 来达到,其实这个命令中最常用的一条命令为
chage -d 0 用户名
这个命令其实是把密码修改日期归零了,这样用户在一登录就需要修改密码,修改过后,shadow第三字段发生改变,该用户以后就可以正常使用了。这条命令的作用常见于批量添加用户后设置了一个极为简单的密码,当某人使用其中的一个用户第一次登录时,就可以创建属于自己的密码。
5、删除用户
userdel [选项] 用户名
-r 删除用户同时删除用户家目录
相当于手动删除这些文件:
/etc/passwd、/etc/shadow、/etc/group、/etc/gshadow、/var/spool/mail/用户名、/home/用户名
6、切换用户身份
su [选项] 用户名
- : 连带用户的环境变量一起切换
-c :仅执行一次命令,而不切换用户身份
如果我们只用用 su root 命令切换用户身份,通过 env 命令查看环境变量时,发现一些信息根本没变(见下图)。既然已经切换了root,为什么有些地方还是看起来还是之前的普通用户?这一问题通常会导致一些常见的错误发生。所以我们在切换用户时,一定要使用 “-” 选项
su – root -c “useradd test_3”
不切换成root,只是利用root身份执行一个命令。
7、添加组
groupadd [选项] 组名
-g GID : 指定组id
8、修改组
groupmod [选项] 组名
-g GID : 修改组id
-n 新组名 :修改组名
例:group -n group2 group1 把组名从group1修改为group2
9、删除用户组
groupdel 组名
如果该组中有初始用户,该组是删除不了的
如果该组中只有附加用户,可以删除
10、向组中添加用户
gpasswd [选项] 组名
-a 用户名 :把用户加入组
-d 用户名 : 把用户从组中删除