15分钟
任务 3 批量创建用户shell脚本编写
任务目的
编写Shell脚本,按行循环读取文件内容。每次循环取出一行,并将这一行的内容切分,分别将用户名和密码赋值给不同变量,把变量交给后续的useradd
和passwd
命令,从而实现每个循环新建一个用户、设置一次密码的效果。
任务步骤
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
循环用于做重复性工作,此处用于一行一行地循环读取文件,用do
和done
标识了循环动作的开始和结束。只有当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
,可以看到新建的用户在最后。
再执行一次该脚本,由于已经是第二次执行,用户已经存在,不能再次创建,会提示跳过了已存在的用户。此时需要的基本功能已经实现。
学员评价