目 录
一、要求
有时候,在安装一个linux系统后,要创建很多用户,账户名不同、密码不同,这就非常麻烦。有没有办法,直接把客户给我们的账号密码表直接读出来,然后通过一个命令完成所有的操作?
二、解决方案
(一)解决思路
可以写一个bash脚本,一行行的读取账户密码文件,解析出账号名和密码,然后再调用useradd和passwd等命令,来添加账号和密码。
(二)方案
(1)把账号密码表文件的内容进行格式化,以便脚本可以直接读取;
(2)判断文件存在性;
(3)判断用户是否存在;
(4)遍历文件,读出账号名和密码;
(5)调用useradd和passwd添加用户和密码到系统中。
三、脚本程序实现
直接把脚本写出来,分享给大家。
(一)脚本代码和解释
1、脚本代码
由于我的环境是centos7.9,编写如下bash代码,可以在centos7以后得版本运行,如下:
#!/bin/bash
#提前准备账号密码文件 userlist.txt
#文件内每个账号密码组,使用逗号分隔(username,password)
# 检查userlist.txt文件是否存在
if [ ! -f "userlist.txt" ]; then
echo "userlist.txt 文件不存在."
exit 1
fi
# 从userlist.txt中读取用户和密码并创建用户
while IFS=, read -r username password; do
# 检查用户是否已存在
if ! id "$username" &>/dev/null; then
# 创建用户
if useradd "$username" &>/dev/null; then
# 设置密码
echo "$password" | passwd --stdin "$username"
if [ $? -eq 0 ]; then
echo "用户 $username 创建成功,密码已设置."
else
echo "为用户 $username 设置密码失败."
# 这里可以选择是否删除刚创建的用户
# userdel -r "$username"
fi
else
echo "创建用户 $username 失败."
fi
else
echo "用户 $username 已存在."
fi
done < "userlist.txt"
2、代码解释
脚本的目的是从一个名为`userlist.txt`的文件中读取用户名和密码,并尝试在系统中创建对应的用户并设置密码 。 解释如下:
1). `if [ ! -f "userlist.txt" ]; then`
* 这是一个条件判断语句,检查`userlist.txt`文件是否存在。`-f`是一个测试运算符,用于检查指定的文件是否存在且是一个常规文件。
* `!`是一个逻辑非运算符,用于反转条件的结果。因此,`! -f "userlist.txt"`将返回真(即非零退出状态),如果`userlist.txt`文件不存在。
2). `echo "userlist.txt 文件不存在."`
* 如果上面的条件为真(即`userlist.txt`不存在),则输出错误信息。
3). `exit 1`
* 如果`userlist.txt`不存在,脚本将立即退出,并返回状态码1,表示出现错误。
4). `fi`
* 表示`if`语句的结束。
5). `while IFS=, read -r username password; do`
* 这是一个`while`循环,用于逐行读取`userlist.txt`文件的内容。
* `IFS=,`设置了内部字段分隔符(Internal Field Separator)为逗号,这意味着`read`命令会将每行内容按照逗号分隔成不同的字段。
* `read -r username password`读取每行的内容,并将其分别赋值给`username`和`password`变量。`-r`选项使`read`命令不解释反斜杠转义字符。
6). `if ! id "$username" &>/dev/null; then`
* 检查用户是否已经存在。`id`命令用于获取用户的UID(用户ID)和GID(组ID)。如果用户不存在,`id`命令会返回一个非零的退出状态。
* `&>/dev/null`是一个重定向,它将标准输出和标准错误都重定向到`/dev/null`,这意味着任何由`id`命令产生的输出或错误消息都会被丢弃,脚本不会显示它们。
7). `if useradd "$username" &>/dev/null; then`
* 如果用户不存在,则尝试使用`useradd`命令创建新用户。
* 同样,`&>/dev/null`用于丢弃任何输出或错误消息。
8). `echo "$password" | passwd --stdin "$username"`
* 如果用户创建成功,则使用`passwd`命令和`--stdin`选项设置用户的密码。这里使用了管道(`|`),它将`echo`命令的输出(即密码)作为`passwd`命令的输入。
9). `if [ $? -eq 0 ]; then`
* 检查上一个命令(即`passwd`)的退出状态。在bash中,`$?`保存了上一个命令的退出状态。退出状态0通常表示命令成功执行,非零值表示出错。
10). `echo "用户 $username 创建成功,密码已设置."`
* 如果`passwd`命令成功执行(即退出状态为0),则输出成功信息。
11). `else`
* 如果`passwd`命令执行失败(即退出状态非零),则执行以下语句。
12). `echo "为用户 $username 设置密码失败."`
* 输出密码设置失败的信息。
* 注释中提到了可以选择删除刚创建的用户,但脚本中没有实现这一操作。
13). `fi`
* 表示第一个`if`语句(即检查用户是否存在并尝试创建用户的语句)的结束。
14). `else`
* 如果用户已经存在,则执行以下语句。
15). `echo "用户 $username 已存在."`
* 输出用户已存在的信息。
16). `fi`
* 表示第二个`if`语句(即检查用户是否已存在的语句)的结束。
17). `done < "userlist.txt"`
* 表示`while`循环的结束,并从`userlist.txt`文件中读取下一行内容。这个重定向(`<`)使得`while`循环能够从`userlist.txt`文件中逐行读取内容。
(二)脚本验证
1、脚本编辑
使用编辑器,比如vi,把代码输入进去;
保存这个脚本到一个文件中,比batch_create_user.sh
2、给予执行权限
chmod +x w batch_create_user.sh
3、运行脚本,查看效果
可以运行这个脚本来检查进程的运行情况,如下:
[root@localhost home]#
[root@localhost home]#
[root@localhost home]# cat userlist.txt
user-1,test123
user-2,test223
user-3,test323
[root@localhost home]#
[root@localhost home]#
[root@localhost home]# cat /etc/passwd | awk -F: '$3>1000 {print $1}'
home
user6
[root@localhost home]#
[root@localhost home]#
[root@localhost home]# sh batch_create_user.sh
更改用户 user-1 的密码 。
passwd:所有的身份验证令牌已经成功更新。
用户 user-1 创建成功,密码已设置.
更改用户 user-2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
用户 user-2 创建成功,密码已设置.
更改用户 user-3 的密码 。
passwd:所有的身份验证令牌已经成功更新。
用户 user-3 创建成功,密码已设置.
[root@localhost home]#
[root@localhost home]#
[root@localhost home]# cat /etc/passwd | awk -F: '$3>1000 {print $1}'
home
user6
user-1
user-2
user-3
[root@localhost home]#
从实际运行可以看出,user-1,user-2,user-3已经成功设置好。脚本运行正常。
四、扩展
在实际使用中, 可能还要设置用户的其他公有属性,可以直接添加到脚本中。
另外,需要注意的是,密码是作为明文放到文件中的,分发给每个人的时候,要求大家一定要更改密码。可以编写一个脚本,检验用户是否更改了密码,具体如何做就不累述了。