目 录
有时候,在安装一个linux系统后,要创建很多用户,账户名不同、密码不同,这就非常麻烦。有没有办法,直接把客户给我们的账号密码表直接读出来,然后通过一个命令完成所有的操作?
可以写一个bash脚本,一行行的读取账户密码文件,解析出账号名和密码,然后再调用useradd和passwd等命令,来添加账号和密码。
(1)把账号密码表文件的内容进行格式化,以便脚本可以直接读取;
(2)判断文件存在性;
(3)判断用户是否存在;
(4)遍历文件,读出账号名和密码;
(5)调用useradd和passwd添加用户和密码到系统中。
直接把脚本写出来,分享给大家。
由于我的环境是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"
脚本的目的是从一个名为`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`文件中逐行读取内容。
使用编辑器,比如vi,把代码输入进去;
保存这个脚本到一个文件中,比batch_create_user.sh
chmod +x w batch_create_user.sh
可以运行这个脚本来检查进程的运行情况,如下:
-
- [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已经成功设置好。脚本运行正常。
在实际使用中, 可能还要设置用户的其他公有属性,可以直接添加到脚本中。
另外,需要注意的是,密码是作为明文放到文件中的,分发给每个人的时候,要求大家一定要更改密码。可以编写一个脚本,检验用户是否更改了密码,具体如何做就不累述了。