15分钟

任务 3 批量创建用户shell脚本编写

任务目的

编写Shell脚本,按行循环读取文件内容。每次循环取出一行,并将这一行的内容切分,分别将用户名和密码赋值给不同变量,把变量交给后续的useraddpasswd命令,从而实现每个循环新建一个用户、设置一次密码的效果。

任务步骤

1.创建脚本基本结构

Linux Bash Shell脚本的创建与基本循环体的编写

vim users.sh
新建脚本文件并打开

I键进入插入模式。写入Bash Shell固定格式的开头内容,以及while循环体,并使用输入重定向符号(<符号)将用户名文本文件作为脚本的输入信息,输入到循环体中,进行循环处理。

#!/bin/bash
 while read LINES
  do

  done < $1
脚本的创建与基本循环体的编写
  • 其中第一行#!/bin/bash是Linux Bash Shell固定通用格式,表示该文件为Bash Shell脚本。
  • while循环用于做重复性工作,此处用于一行一行地循环读取文件,用dodone标识了循环动作的开始和结束。只有当while后面的条件被判定为“否”时,才会自动停止循环。
  • 此处whlie循环的条件为read LINES。其中read是Linux自带函数,功能是读取输入(默认读取从键盘输入的内容),并将读取到的内容赋值给后面的变量,也就是此处的LINES。如果文件已经循环读取到最后一行,read将无法读到新的内容,此时条件判定为“否”,循环自动终止。
  • while循环最后done < $1表示将该脚本运行时的第一个参数作为while循环的输入。其中<符号为输入重定向,表示此时不从键盘读取输入,而是从另一个文件读取内容作为输入。
  • 预定义参数$1表示该脚本运行时的第一个参数。在执行脚本时放在脚本后面的第一个变量用$1表示,例如命令sh users.sh users.txt中的users.txt文件即赋值给$1变量。此处使用预定义变量是因为实际应用时,用户名信息文件可能有多个,不会完全固定,因此不适合写入脚本,更适合由用户自己指定。

2.用户信息的截取和赋值

对每行内容进行截取并赋值给变量。在while循环中加入以下两行内容。

     username=`echo "$LINES" | cut -f1 -d ","`
     password=`echo "$LINES" | cut -f2 -d ","`
截取内容与变量赋值
  • 管道符|表示前面命令的输出作为后面命令的输入,此处前面的命令echo "$LINES"表示输出变量LINES的值。因此后面cut命令接收到的是一行完整的内容。
  • 管道符后的cut -f1 -d ","表示以逗号为分隔符,分隔内容后取第一部分。
  • 最终效果为,把当前取到的一行文本内容用逗号分隔开,第一部分赋值给username变量,第二部分赋值给password变量。

3.新建用户并设置密码

新建用户并为用户设置密码。在while循环中加入以下内容。

     useradd "$username"
      if [ $? -eq 0  ];then
         echo "$password" | passwd --stdin $username
      else
         echo "$username already exists,skip the password"
      fi
新建用户并为用户设置密码
  • 新建用户通过useradd "$username"实现,useradd后面接username变量的值,可以直接创建该用户。
  • 密码通过"echo $password" | passwd --stdin $username进行设置。正常passwd命令需要读取键盘输入,且需要输入两次进行确认。此处使用--stdin表示从其他的来源读取密码,此处读取了前面管道符传输的密码,并把这个密码设置给了$username这个用户。
  • 如果用户已存在,前面的创建用户就不能成功。此时应该跳过该用户,不再给该用户设置密码。因此添加if语句进行判断。Linux中成功的操作返回值(即if语句中的$?)默认为0。创建用户不成功则$?非0。使用-eq(即equal)判断两个数值是否相等,以此产生两个分支,分支1:改密码;分支2:跳过该用户。

4.保存和执行脚本

验证基本功能。保存退出后执行以下命令。

sh users.sh users.txt
基本功能验证

可以看到执行成功。使用cat命令直接查看Linux用户配置文件/etc/passwd,可以看到新建的用户在最后。

新建用户结果查看

再执行一次该脚本,由于已经是第二次执行,用户已经存在,不能再次创建,会提示跳过了已存在的用户。此时需要的基本功能已经实现。

重复执行的效果