Fork me on GitHub

Linux 入门总结(八)

Linux 入门总结(八) —— 用户和用户组管理

用户配置文件

1、用户信息文件 /etc/passwd 详解

在 Linux 中主要是通过用户配置文件来查看和修改用户信息。注意:在操作 passwd 文件的时候备份。可以使用 man 5 passwd 查看配置文件的帮助文档。

/etc/passwd

第 1 个字段:用户名称。

第 2 个字段:密码标志。x 表示这个用户是有密码的。注意 x 是不能省略的,如果省略了,则用户登录的时候,系统是不会去 shadow 文件中去搜索用户的真正密码的,它会认为这个用户压根就没有密码,可以直接登录。没有密码的登录只允许本地登录,不允许远程登录,因为 ssh 协议本身就禁止的。

第 3 个字段:UID(用户 ID)。注意:系统中默认有很多伪用户,但是这些伪用户不能删,一旦删除系统就会崩溃,因为系统有很多服务会调用这些伪用户。这些伪用户是专门用来给系统当中,启动服务、启动命令的时候来调用的。总之这些用户都是系统用户,这些用户不能登录,其次不能删除。

0: 超级用户,注意系统是通过 UID 为 0 来识别是否为超级管理员的,不是通过用户名是否为 root 识别
1-499: 系统用户(伪用户)
500-65535: 普通用户

第 4 个字段:GID(用户初始组 ID)。

初始组:就是指用户一登录就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。初始组的特点:每一个用户都必须有且仅有一个初始组。初始组不能选,但是可以改,一旦改变,以前的初始组就会被放弃,因为只能有一个初始组存在。
附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。

第 5 个字段:用户说明。

第 6 个字段:家目录。

普通用户:/home/用户名/
超级用户:/root/

第 7 个字段:登录之后的 Shell。

Shell 就是 Linux 的命令解释器。在 /etc/passwd 当中,除了标准 Shell 是 /bin/bash 之外,还可以写如 /sbin/nologin。简单来说:就是你在 Linux 中输入一个命令,eg:ll,实际上中间要通过命令解释器将 ll 命令解释成内核可以识别的符号然后传输给内核,内核再作出应答显示在命令操作窗口,这样的一个过程。对命令的解释就是 Shell 来执行的。默认即标准 Shell 是 /bin/bash,Linux 中 Shell 可以有多个,默认为 /bin/bash,理论上可以更改。

2、影子文件 /etc/shadow 详解

注意:/etc/shadow 文件的默认权限为 000,该文件很重要,保存了加密以后的用户密码。

/etc/shadow

第 1 个字段:用户名。
第 2 个字段:加密密码。注意:如果密码位是「!!」或「*」代表没有密码,不能登录。
第 3 个字段:密码最后一次修改日期。使用 1970.01.01 作为标准时间,每过一天时间戳加 1。
第 4 个字段:两次密码的修改间隔时间(和第 3 字段相比)。
第 5 个字段:密码有效期(和第 3 字段相比)。
第 6 个字段:密码修改到期前的警告天数(和第 5 字段相比)。
第 7 个字段:密码过期后的宽限天数(和第 5 字段相比)。0 代表密码过期后立即失效。-1 则表示密码永远不会失效。
第 8 个字段:账号失效时间。要用时间戳表示。不管前面怎么设置,到时间了直接密码失效。
第 9 个字段:保留。

时间戳换算方法:

1
2
3
4
5
6
# 把时间戳换算为日期
date -d "1970-01-01 16666 days"

# 把日期换算为时间戳
# $() 用来引用系统命令,date --date="2018/10/01" +%s 将指定日期换算成秒(以 1970.01.01 作为标准时间)
echo $(($(date --date="2018/10/01" +%s)/86400+1))

3、组信息文件 /etc/group

/etc/group

第 1 个字段:组名。
第 2 个字段:组密码标志。
第 3 个字段:GID。
第 4 个字段:组中附加用户。

4、组密码文件 /etc/gshadow

/etc/gshadow

第 1 个字段:组名。
第 2 个字段:组密码。
第 3 个字段:组管理员用户名。
第 4 个字段:组中附加用户。

组密码的作用:只有管理员可以将用户加入到其他的用户组,但是 root 太忙了,这时候可以给组选一个管理员,给这个组设置一个密码,只要这个管理员知道密码,就可以把其他人拉到这个组里面来。或者把用户从这个组里面删掉。不推荐使用组密码,安全性差。

用户管理相关文件

1、用户的家目录

普通用户:/home/用户名/,所有者和所属组都是此用户,权限 700。
超级用户:/root,所有者和所属组都是 root 用户,权限是 550。

注意:用户的家目录是添加用户的时候自动生成的,可以在添加的时候不让它自动生成,手动创建,但是所有者、所属组以及权限都需要手动去调整。将普通用户变为超级管理员,修改 /etc/passwd 文件,将用户的 UID 改为 0,但是用户的家目录不会改变成 root,还是原来的家目录,只是它的权限是超级用户的权限了。

2、用户的邮箱
用户邮箱目录:/var/spool/mail/用户名/。注意:/var 目录是 Linux 中可变数据的保存位置。

3、用户模板目录 /etc/skel/
注意:添加一个用户会默认修改 7 个位置的文件,分别是:/etc/passwd/、/etc/shadow/、/etc/group/、/etc/gshadow/、家目录、邮箱目录、用户模板目录。模板文件 /etc/skel 里面有隐藏文件,新添加的用户,系统会默认将里面的文件拷贝到其所在的家目录下的。所以,添加一个用户实际会默认修改 6 个位置的文件,因为模板只是从其里面拷贝用的,不会修改。

用户管理命令

1、用户添加命令 useradd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
useradd 命令格式:
useradd [选项] 用户名

选项:
-u UID 手工指定用户的 UID 号
-d 家目录 手工指定用户的家目录
-c 用户说明 手工指定用户的说明。如果输入的内容之间有空格,要加双引号
-g 组名 手工指定用户的初始组
-G 组名 指定用户的附加组。可以同时指定多个附加组,中间以逗号分隔
-s shell 手工指定用户的登录 Shell。默认是 /bin/shell

举例:
# 添加默认用户,注意有 6 个位置的文件会被修改外加 1 个位置的文件被复制
useradd test

# 指定选项添加用户
useradd -u 666 -d /home/test -c "test add user" -g test -G root,bin -s /bin/bash test

用户默认值文件:/etc/default/useradd
/etc/default/useradd

用户默认值文件:/etc/login.defs
/etc/login.defs

注意:密码最小长度为 5 位的那条记录已经不生效了,因为其定义的密码强度过于简单,现在采用的是 PAM 验证生效即默认最少 8 位。

2、修改用户密码 passwd

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
passwd 命令格式:
passwd [选项] 用户名

选项:
-S 查询用户密码的密码状态。仅 root 用户可用。
-l 暂时锁定用户。仅 root 用户可用。
-u 解锁用户。仅 root 用户可用。
--stdin 可以通过管道符输出的数据作为用户的密码 (stdin 标准输入)。

举例:
# 查看密码状态
passwd -S test
输出结果为: test PS 2018-04-11 0 99999 7 -1 (密码已设置,使用 SHA512 算法。)
解析输出结果:用户名(test) 密码状态(PS 密码已设置、LK 密码已锁定) 密码设定时间(2018-04-11)
密码修改间隔时间(0) 密码有效期(99999) 警告时间(7) 密码不失效(-1)

# 锁定用户
passwd -l test
# 解锁用户
passwd -u test

# 使用字符串作为用户的密码
# 注意:使用 --stdin 每个用户的密码都是使用明文的方式保存下来的,所以要提醒每个用户登录以后要修改密码
echo "123" | passwd --stdin test

passwd 直接回车,表示给当前用户设置密码。 新建的用户如果没有设置密码是不能远程登录的,但是可以在本地无密码登录。普通用户修改密码只能使用 passwd,后面是不能加用户名的,只有超级用户可以。

3、修改用户信息 usermod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
usermod 即 user modify 修改用户的意思

命令格式:
usermod [选项] 用户名

选项:
-u UID 修改用户的 UID 号
-c 用户说明 修改用户的说明信息
-G 组名 修改用户的附加组
-L 临时锁定用户(Lock)
-U 解锁用户锁定(Unlock)

举例:
# 修改用户说明
usermod -c "test user" test

# 把 test 用户加入 root 组
usermod -G root test

# 锁定解锁用户
usermod -L test
usermod -U test

4、修改用户密码状态 chage

注意:是 chage 不是 change,没有 n 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
命令格式:
chage [选项] 用户名

选项:
-l 列出用户的详细密码状态
-d 日期 修改密码最后一次更改日期(shadow 3 字段)
-m 天数 修改两次密码修改间隔(shadow 4 字段)
-M 天数 修改密码有效期(shadow 5 字段)
-W 天数 修改密码过期前警告天数(shadow 6 字段)
-I 天数 修改密码过期后宽限天数(shadow 7 字段)
-E 日期 修改账号失效时间(shadow 8 字段)

举例:
# 该命令把密码修改日期归 0 了(shadow 3 字段),这样用户一登录就要修改密码。
# 即用户从来没有修改过密码,即第一次密码时间为 1971-01-01,所以你一登录系统就会要求你更改密码。即把用户的密码修改时间归零。
chage -d 0 test

5、删除用户 userdel

1
2
3
4
5
6
7
8
9
10
11
12
13
14
命令格式:
userdel [选项] 用户名

选项:
-r 删除用户的同时删除用户家目录

举例:
# 手动删除用户
vim /etc/passwd
vim /etc/shadow
vim /etc/group
vim /etc/gshadow
rm -rf /var/spool/mail/lamp
rm -rf /home/用户名

查看用户 ID:

1
id 用户名

切换用户身份 su:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
命令格式:
su [选项] 用户名

选项:
- 选项只使用「-」代表连带用户的环境变量一起切换
-c 命令 仅执行一次命令,而不切换用户身份

举例:
# 切换成 root
# 命令 env 用来查看用户环境变量(环境变量就是这个用户当前所操作的环境)
# 注意:su 命令切换的时候中间的减号一定不能省略,而且减号前后都有空格
# 从普通用户切换超级用户或其他普通用户需要输入密码,从超级用户切换普通用户不需要输入密码
su - root

# 不切换成 root,但是执行 useradd 命令添加 user1 用户
# 没有切换用户,用 -c 选项表示暂时性的调用 root 身份去执行一条 root 用户才能执行的命令
su - root -c "useradd user1"

用户组管理命令

1、添加用户组

1
2
3
4
5
格式:
groupadd [选项] 组名

选项:
-g GID 指定组 ID

2、修改用户组

1
2
3
4
5
6
7
8
9
10
格式:
groupmod [选项] 组名

选项:
-g GID 修改组 ID
-n 新组名 修改组名

举例:
# 把组名 group1 修改为 group2
groupmod -n group2 group1

3、删除用户组

1
2
格式:
groupdel 组名

对于组的删除:如果这个组里面是某个用户的初始组,则这个组不能删。要想删除这个组首先要删除用户。如果某个组里面没有初始用户,附加用户有没有都可以删除,里面的用户会自动被清空。

4、把用户添加入组或从组中删除用户

1
2
3
4
5
6
7
8
9
10
格式:
gpasswd [选项] 组名

选项:
-a 用户名 把用户加入组
-d 用户名 把用户从组中删除

示例:
gpasswd -a 用户名 用户组
gpasswd -d 用户名 用户组

Linux 本地无密码登录方法:将 /etc/passwd/ 文件中对应用户的密码标志位置为空,即去掉 x。然后在本地直接输入用户名就可以登录了。

-------------本文结束感谢您的阅读-------------

本文标题:Linux 入门总结(八)

文章作者:Yan ChongSheng

发布时间:2018年10月22日

最后更新:2018年10月30日

原始链接:yanchongsheng.github.io/2018/10/22/Linux-2018-10-22-Linux入门总结-八/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

开启打赏模式