# CentOS 7 环境下大量建立账户的方法

系统上如果有一堆账户,怎么判定某些账户是否存在一些问题?如何创建或删除大量账户?

这个肯定是需要用到 shell script 脚本的,下面一一介绍

# 一些账户相关的检查工具

# pwck

该指令会检查 /etc/passwd 账户配置文件内的信息,与实际的家目录是否存在,等信息、还可以比对 /etc/passwd/etc/shadow 的信息是否一致、如果 /etc/passwd 内的数据字段错误时,会提示使用者。

一般来说,作者只是利用这个指令来检查输入是否正确

[root@study ~]# pwck
user 'ftp': directory '/var/ftp' does not exist
user 'saslauth': directory '/run/saslauthd' does not exist
user 'gluster': directory '/run/gluster' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'gnome-initial-setup': directory '/run/gnome-initial-setup/' does not exist
pwck: no changes
1
2
3
4
5
6
7

上面告知了这些账户没有家目录;仔细看由于大部分都是系统账户(的确不需要家目录)

# 对应的群组检查
[root@study ~]# grpck
1
2

# pwconv

该指令主要目的是将 /etc/passwd 账户与密码移动到 /etc/shadow 中。(早起的 Unix 中没有 shadow 文件,在 passwd 的第 2 字段)

使用 pwdconv 后:

  • 比对 /etc/passwd/etc/shadow

    若 passwd 存在的账户并没有对应的 shadow 密码时,则 pwconv 会去 /etc/login.defs 获取相关的密码数据,并建立该账户的 shadow 数据

  • /etc/passwd 内存在加密后的密码数据时,则 pwconv 会将该密码栏移动到 /etc/shadow 中,并将原来的密码栏内容变更为 x

所以该工具只是为了迁移早期的数据而存在的,对于现在几乎上没有啥用处了

# pwunconv

该指令是将 /etc/shadow 内的密码栏数据写回 /etc/passwd 中,并且删除 /etc/shadow 文件

# chpasswd

读取未加密前的密码,加密并将加密后的密码写入 /etc/shadow

该指令可以用在大量建立账户的场景中,可以由 Standard input 读入数据,数据格式为 username:password

# 比如:更新 mrcode3 账户的密码
[root@study ~]# echo "mrcode3:123" | chpasswd
[root@study ~]# grep mrcode3 /etc/shadow
mrcode3:$6$v4wtD/HDxmMD.F$tkpuAZ3Onx14Oa2YYqpD3CfZrexV0D18nolGGfl7cIcXG/57r2S2S2oQzHjuiN4efmFYCOpHS.cK/.cVDk6zi/:18318::::::
[root@study ~]# echo "mrcode3:123abv" | chpasswd
[root@study ~]# grep mrcode3 /etc/shadow
mrcode3:$6$kqggs/OgGqR0ftc$zHF9FbcJqd0fWHNx4hGwWXcQgrjPosDcpDed7iH7/LYb0tAOBerMvUzodNrX.K4UW5AUYs9S/DGaetJBD3xu6.:18318::::::
# 观察下密码栏的加密字符串,发现的确是被更新过了
1
2
3
4
5
6
7
8

它预设使用 SHA512 进行加密,想要更改就需要使用 -c 和 -e 选项来指定。不过从 CentOS 5.x 之后,passwd 指令已经添加了 --stdin 选项,可以说是替代了这里的功能

# 大量建立账户模板(适用 passwd --stdin 选项)

下面是一个新站用户功能的脚本

vim accountadd.sh

#!/bin/bash
# This shell script will create amount of linux login accounts for you.
# 1. check the "accountadd.txt" file exist? you must create that file manually
#	one account name one line in the "accountadd.txt" file
# 2. use openssl to create users password
# 3. User must change his password in his first login
#
# 此命令行命令脚本将为您创建大量 Linux 登录。
# 1.检查 "accountadd.txt" 文件是否存在?您必须手动创建该文件,一个账户一行
# 2.使用 openssl 创建用户密码
# 3.用户必须在首次登录时更改密码
export PATH=/bin:/sbin:/usr/bin:/usr/sbin

# 0. userinput
usergroup=""		# 如果你的账户需要次要组,在这里定义
pwmech="openssl"	# 如果是 openssl(生成随机数) 则使用 openssl 指令生成 base64 的 6 位数随机密码
homeperm="no"		# 如果修改为 yes,则将该账户家目录权限修改为 711

# 1. 检查 accountadd.txt 文件
action="${1}"			# create 使用 useradd 指令、delete 使用 userdel 指令
if [ ! -f accountadd.txt ]; then
	echo "accountadd.txt 文件不存在!"
	exit 1
fi

# 如果有群组,则建立系统群组
[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)

for username in ${usernames} 
do
	case ${action} in
		"create")
			# 存在组则拼接选项 -G 是为该用户添加次要群组
			[ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
			useradd ${usegrp} ${username}	# 新增账户
			# 如果没有值则使用用户名作为密码
			[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}
			echo ${usepw} | passwd --stdin ${username}  # 创建密码
			chage -d 0 ${username}		# 配置首次登陆必须修改密码
			[ "${homeperm}" == "yes" ] && chmod 711 /home/${username}
			echo "username=${username},password=${usepw}" >> outputpw.txt
		;;
		"delete")
			echo "删除用户 ${username}"
			userdel -r ${username}			# -r 将用户家目录也删除
		;;
		*)
			echo "请使用:$0 [create|dellete]"
		;;
	esac
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

脚本写好了,接下来进行测试

vim accountadd.txt

std01
std02
std03
std04
std05
1
2
3
4
5
6
7
sh accountadd.sh create
[root@study ~]# sh accountadd.sh create
更改用户 std01 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 std02 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 std03 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 std04 的密码 。
passwd:所有的身份验证令牌已经成功更新。
更改用户 std05 的密码 。
passwd:所有的身份验证令牌已经成功更新。

[root@study ~]# cat outputpw.txt 
username=std01,password=s4j4jdwr
username=std02,password=G4iW/O6M
username=std03,password=HGO0rvI8
username=std04,password=17NAhvgS
username=std05,password=Q2CftODm

# 可以看到输出的账户和密码信息,你可以打印出来,一行一条裁剪,然后发给使用者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21