• Linux系统运维脚本:批量创建linux用户和密码(读取文件中的账号和密码来批量创建用户)


    目           录

    一、要求

    二、解决方案

    (一)解决思路

    (二)方案

    三、脚本程序实现

    (一)脚本代码和解释

    1、脚本代码

    2、代码解释

    (二)脚本验证

    1、脚本编辑

    2、给予执行权限

    3、运行脚本,查看效果

    四、扩展


    一、要求

            有时候,在安装一个linux系统后,要创建很多用户,账户名不同、密码不同,这就非常麻烦。有没有办法,直接把客户给我们的账号密码表直接读出来,然后通过一个命令完成所有的操作?

    二、解决方案

    (一)解决思路

            可以写一个bash脚本,一行行的读取账户密码文件,解析出账号名和密码,然后再调用useradd和passwd等命令,来添加账号和密码。

    (二)方案

           (1)把账号密码表文件的内容进行格式化,以便脚本可以直接读取;

           (2)判断文件存在性;

           (3)判断用户是否存在;

           (4)遍历文件,读出账号名和密码;

           (5)调用useradd和passwd添加用户和密码到系统中。

    三、脚本程序实现

            直接把脚本写出来,分享给大家。

    (一)脚本代码和解释

    1、脚本代码

            由于我的环境是centos7.9,编写如下bash代码,可以在centos7以后得版本运行,如下:

    1. #!/bin/bash
    2. #提前准备账号密码文件 userlist.txt
    3. #文件内每个账号密码组,使用逗号分隔(username,password)
    4. # 检查userlist.txt文件是否存在
    5. if [ ! -f "userlist.txt" ]; then
    6. echo "userlist.txt 文件不存在."
    7. exit 1
    8. fi
    9. # 从userlist.txt中读取用户和密码并创建用户
    10. while IFS=, read -r username password; do
    11. # 检查用户是否已存在
    12. if ! id "$username" &>/dev/null; then
    13. # 创建用户
    14. if useradd "$username" &>/dev/null; then
    15. # 设置密码
    16. echo "$password" | passwd --stdin "$username"
    17. if [ $? -eq 0 ]; then
    18. echo "用户 $username 创建成功,密码已设置."
    19. else
    20. echo "为用户 $username 设置密码失败."
    21. # 这里可以选择是否删除刚创建的用户
    22. # userdel -r "$username"
    23. fi
    24. else
    25. echo "创建用户 $username 失败."
    26. fi
    27. else
    28. echo "用户 $username 已存在."
    29. fi
    30. 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、运行脚本,查看效果

         可以运行这个脚本来检查进程的运行情况,如下:

    1. [root@localhost home]#
    2. [root@localhost home]#
    3. [root@localhost home]# cat userlist.txt
    4. user-1,test123
    5. user-2,test223
    6. user-3,test323
    7. [root@localhost home]#
    8. [root@localhost home]#
    9. [root@localhost home]# cat /etc/passwd | awk -F: '$3>1000 {print $1}'
    10. home
    11. user6
    12. [root@localhost home]#
    13. [root@localhost home]#
    14. [root@localhost home]# sh batch_create_user.sh
    15. 更改用户 user-1 的密码 。
    16. passwd:所有的身份验证令牌已经成功更新。
    17. 用户 user-1 创建成功,密码已设置.
    18. 更改用户 user-2 的密码 。
    19. passwd:所有的身份验证令牌已经成功更新。
    20. 用户 user-2 创建成功,密码已设置.
    21. 更改用户 user-3 的密码 。
    22. passwd:所有的身份验证令牌已经成功更新。
    23. 用户 user-3 创建成功,密码已设置.
    24. [root@localhost home]#
    25. [root@localhost home]#
    26. [root@localhost home]# cat /etc/passwd | awk -F: '$3>1000 {print $1}'
    27. home
    28. user6
    29. user-1
    30. user-2
    31. user-3
    32. [root@localhost home]#

    从实际运行可以看出,user-1,user-2,user-3已经成功设置好。脚本运行正常。

    四、扩展

            在实际使用中, 可能还要设置用户的其他公有属性,可以直接添加到脚本中。

            另外,需要注意的是,密码是作为明文放到文件中的,分发给每个人的时候,要求大家一定要更改密码。可以编写一个脚本,检验用户是否更改了密码,具体如何做就不累述了。

  • 相关阅读:
    MySQL详细学习教程(建议收藏)
    黑猫带你学NandFlash第3篇:nandflash介质工作原理,你想要的都在这里!
    3 redis实现一个消息中间件
    抖音超火的JavaScript和Canvas外太空表盘两款网页制作
    QT 5.15 Android Windows 10开发环境搭建
    联邦学习的梯度重构
    火狐浏览器翻译页面功能如何设置
    uniapp websocket原生服务(自动重连、心跳检测) Ba-Websocket
    SEO的了解
    京东商品接口加解密算法解析
  • 原文地址:https://blog.csdn.net/weixin_70208651/article/details/136490961