运维弟弟养成日记?

/etc/passwd

这个文件用来保存系统中所有的用户和用户的主要信息。是所有用户!
系统中的用户很多,其中包含了一些系统用户或称伪用户。这些用户无法登陆系统,但是也不能删除。如果删除了这些用户,依赖于该用户的程序或者服务就无法正常执行。

文件每条记录格式如下,

1
root:x:0:0:root:/root:/bin/bash

用户名称

第一个字段root即用户的名称为root。需要注意的是Linux并非更具名称来区分不同用户,而是通过UID

密码标志

第二个字段x即用户的密码标志,并非真正的密码,密码保存在/etc/shadow文件之中。而x是表示该用户拥有密码。如果删除该字段,系统会认为该用户没密码,导致只需要输入用户名就可以登陆(远程登录是不行的)

UID

第三个字段就是UID,用来分配用户权限,和识别不同用户。

1
2
3
0:超级用户 UID。如果用户 UID 为 0,则代表这个账号是管理员账号。把普通用户升级成管理员,只需把其他用户的 UID 修改为 0 就可以了。
1~499:系统用户(伪用户)UID。这些 UID 是系统保留给系统用户的 UID,也就是说 UID 是 1~499 范围内的用户是不能登录系统的,而是用来运行系统或服务的。其中,1~99 是系统保留的账号,系统自动创建;100~499 是预留给用户创建账号的。
500~65535:普通用户 UID。建立的普通用户 UID 从 500 开始,最大到 65535。

GID

第四个字段是GID,即用户的组。

home目录

第六个字段为home目录的路径

shell类型

第七个字段表示拥护登陆以后的shell类型。Linux 的标准 Shell 就是 /bin/bash。

/etc/shadow

这个文件中保存着用户的实际加密密码和密码有效期等参数。权限为000,除了root用户,任何用户是无法查看的。

文件格式如下:

1
root:$6$UHVem/sMNvQ/pxd$Arr0HntecztPDbX2ecCCR2G/Fi3WEVJ22XncGK4I1.:17961:0:99999:7:::

一共分成九个字段

用户名称

第一个字段中保存的是用户名称,和 /etc/passwd 文件的用户名称相对应。

密码

第二个字段中保存的是真正加密的密码。可以在密码前人为地加入”!”或”*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。所有伪用户的密码都是”!!”或”*”,代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是”!!”,代表这个用户没有密码,不能登录。

密码最后一次修改曰期

第三个字段是密码的修改日期。给的是时间戳。可以使用date - d '1970-01-01 时间戳 days'来换算成我们能看懂的时间。

密码的两次修改间隔时间

第四个字段是密码的两次修改间隔时间。这个字段要和第三个字段相比。如果为0可以随意修改。如果为10则十天以后才能修改。

密码的有效期(和第三个字段相比)

第五个字段是密码的有效期,单位是天

密码修改到期前的警告天数

第六个字段是密码修改到期前的警告天数,当密码有效期快到了,每次登陆的时候就会警告修改密码

密码过期后的宽限天数

第七个字段是密码过期后的宽限天数。也就是密码过期后,用户如果还是没有修改密码,那么在宽限天数内用户还是可以登录系统的

账号失效时间

第八个字段是用法的账号失效时间。这里同样要写时间戳,也就是用 1970 年 1 日 1 日进行时间换算。如果超过了失效时间,就算密码没有过期,用户也就失效,无法使用了。

第九个字段保留,未使用

/etc/group

这个文件是记录组 ID(GID) 和组名的对应文件。

格式如下,分成四个字段

1
root:x:0:

组名

第一个字段是组名

密码标志

和前面提到的一样x是密码标志,真正的密码存在/etc/gshadow里。

GID

第三个字段是用户组的ID,和UID的作用一样。

组中的用户

第四个字段表示的就是这个用户组中到底包含了哪些用户,如果该用户组是这个用户的初始组,则该用户不会写入这个字段

/etc/gshadow

这个文件就是保存组密码的文件。

文件格式如下一共四个字段

1
root:::

组名

组密码

第二个字段就是实际加密的组密码。注意,对于大多数用户来说,这个字段不是空就是”!”,代表这个组没有合法的组密码。

组管理员

组中的附加用户

添加用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
useradd zhhhy  #采取默认设置添加一个用户

选项:
-u UID: 手工指定用户的 UID,注意手工添加的用户的 UID 不要小于 500;
-d 家目录:手工指定用户的家目录。家目录必须写绝对路径,而且如果需要手工指定家目录,则一定要注意权限;
-c 用户说明:手工指定用户说明。还记得 /etc/passwd 文件的第五个字段吗?这里就是指定该字段内容的;
-g 组名:手工指定用户的初始组。一般以和用户名相同的组作为用户的初始组,在创建用户时会默认建立初始组。如果不想使用默认初始组,则可以用 -g 手工指定。不建议手工修改;
-G 组名:指定用户的附加组。我们把用户加入其他组,一般都使用附加组;
-s shell:手工指定用户的登录 Shell。默认是 /bin/bash;
-e 曰期:指定用户的失效曰期,格式为"YYYY-MM-DD"。也就是/etc/shadow文件的第八个字段;
-o:允许创建的用户的 UID 相同。例如,执行"useradd -u 0 -o usertest"命令建立用户 usertest,它的 UID 和 root 用户的 UID 相同,都是 0;
-m:建立用户时强制建立用户的家目录。在建立系统用户时,该选项是默认的;

useradd -u 550 -g test -G root -d /home/zhhhy -c "test user" -s /bin/bash zhhhy
# 指定UID 550 初始组 test 附加组 root home目录为 /home/zhhhy 用户说明‘test user’ 用户登录以后的shell
## 这边的默认值都是来源/etc/default/useradd 和 /etc/login.defs里的默认值
可以使用 useradd -D 来查看默认值
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

修改密码

上文提到了没有添加密码的账户是无法登陆的,于是就要使用passwd这个命令进行修改密码和设置密码

1
2
3
4
5
6
7
8
9
10
passwd [选项] 用户名
选项:
-S:査询用户密码的状态,也就是 /etc/shadow 文件中的内容。仅 root 用户可用;
-l:暂时锁定用户。仅 root 用户可用;
-u:解锁用户。仅 root 用户可用;
--stdin:可以将通过管道符输出的数据作为用户的密码。主要在批量添加用户时使用;
###
passwd 修改当前用户
passwd zhhhy 修改zhhhy密码
echo “aaaa” | passwd zhhhy

修改用户信息

1
2
3
4
5
6
7
8
9
10
11
12
usermod [选项] 用户名

选项:
-u UID:修改用户的UID;
-d 家目录:修改用户的家目录。家目录必须写绝对路径;
-c 用户说明:修改用户的说明信息,就是 /etc/passwd 文件的第五个字段;
-g 组名:修改用户的初始组,就是 /etc/passwd 文件的第四个字段;
-G 组名:修改用户的附加组,其实就是把用户加入其他用户组;
-s shell:修改用户的登录 Shell。默认是 /bin/bash;
-e 日期:修改用户的失效曰期,格式为"YYYY-MM-DD"。也就是 /etc/shadow 文件的第八个字段;
-L:临时锁定用户(Lock);
-U:解锁用户(Unlock);

usermod和useradd的选项参数很相似,区别在于,add是在添加用户时候做设置,而mod是对已有的用户进行做修改

chage指令

用于修改/etc/shadow的第三到第八个字段

可以用作初始用户强制修改密码的功能

1
2
chage -d 0 zhhhy
原理是将密码过期时间修改成了0 也就是立即过期。那么在登陆以后就一定要修改密码

删除用户

1
2
3
4
5
userdel 用户名
## 可以加 -r 参数同事删除用户的home目录
使用命令删除可以一次性的将用户目录,修改/etc/shadow文件 修改/etc/group /etc/gshadow文件 删除邮箱等操作
如果采用手动的删除用户的方式,需要手动做上面的操作。
添加用户也是如此