Shell脚本应用(三)

发布时间:2023年12月25日

一、使用for循环语句

1、for语句的结构

????????使用for 循环语句时,需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列.直到变量值用完退出循环。在这里."取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录、IP黑名单).
????????for 循环语句的语法结构如下所示。

for? ? 变量名? ? in? ? 取值列表

do

? ? ? ? 命令序列

done

????????上述语句结构中,for语句的操作对象为用户指定名称的变量,并通过in关键字为该变量预先设置了一个取值列表,多个取值之间以空格进行分隔。位于do ....... done之间的命令序列称为循环体、其中的执行语句需要引用变量以完成相应的任务。

????????for语句的执行流程:

?2、for语句应用实例

????????1)根据姓名列表批量添加用户

????????根据人事部门给出的员工姓名的拼音列表.在Linux服务器中添加相应的用户账号,初始密码均设置为“123456”。其中,员工姓名列表中的账号数量并不固定,而且除了要求账号名称是拼音之外.并无其他特殊规律。
????????针对上述要求,可先指定员工列表文件 users.txt,然后编写一个名为uaddfor.sh的 Shell脚本,从users ,txt文件中读取各用户名称,重复执行添加用户、设置初始密码的相关操作。

[root@lucky u3]# vim users.txt 
zhangsan
chengxing
dengchao
luha
lancaihe

[root@lucky u3]# vim useraddfor.sh
#!/bin/bash
list=$(cat /root/u3/users.txt)
for pat in $list
do
    useradd $pat
    echo "123456" | passwd --stdin $pat &> /dev/null
done
[root@lucky u3]# chmod +x useraddfor.sh 
[root@lucky u3]# ./useraddfor.sh 
[root@lucky u3]# tail -10 /etc/passwd
zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
chengxing:x:1003:1003::/home/chengxing:/bin/bash
dengchao:x:1004:1004::/home/dengchao:/bin/bash
luha:x:1005:1005::/home/luha:/bin/bash
lancaihe:x:1006:1006::/home/lancaihe:/bin/bash

二、使用while循环语句

1、while语句的结构

????????使用 while 循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足时为止。在脚本应用中,应该避免出现死循环的情况,否则后边的命令操作将无法执行,因此,循环体内的命令序列中应包括修改测试条件的语句,以便在适当的时候使测试条件不再成立,从而结束循环。
????????while循环语句的语法结构如下所示

while? ? ? ? 条件测试操作

do

? ? ? ? ?命令序列

done

????????while语句的执行流程:首先判断while后的条件测试操作结果.如果条件成立,则执行do…done循环体中的命令序列;返回while 后再次判断条件测试结果.如果条件仍然成立,则继续执行循环体,再次返回到while后,判断条件测试结果……如此循环.直到while后的条件测试结果不再成立为止.最后跳转到done语句,表示结束循环。
????????使用while 循环语句时,有两个特殊的条件测试操作.即 true(真)和false (假)。使用true作为条件时,表示条件永远成立,循环体内的命令序列将无限执行下去,除非强制终止脚本(或通过exit语句退出脚本);反之,若使用false作为条件.则循环体将不会被执行。这两个特殊条件也可以用在if语句的条件测试中。

2、while语句应用示例

(1)批量添加规律编号的用户

????????在一些技术培训和学习领域.出于实验或测试的目的.需要批量添加用户账号,这些用户的名称中包含固定的前缀字串,并按照数字顺序依次进行编号,账号的数量往往也是固定的,例如,若要添加20个用户,名称依次为stu1、 stu2、…、stu20,可以参考以下操作。

[root@lucky u3]# vim uaddwhile.sh
#!/bin/bash
prefix="stu"
i=1
while [ $i -le 20 ]
do
   useradd ${prefix}$i
   echo "123456" | passwd --stdin ${prefix}$i &> /dev/null
   let i++
done

[root@lucky u3]# chmod +x uaddwhile.sh 
[root@lucky u3]# ./uaddwhile.sh 
[root@lucky u3]# grep "stu" /etc/passwd | tail -5
stu16:x:1017:1017::/home/stu16:/bin/bash
stu17:x:1018:1018::/home/stu17:/bin/bash
stu18:x:1019:1019::/home/stu18:/bin/bash
stu19:x:1020:1020::/home/stu19:/bin/bash
stu20:x:1021:1021::/home/stu20:/bin/bash

????????若要删除uaddwhile , sh 脚本所添加的用户,只需参考上述脚本代码.将while循环体中添加用户的命令序列改为删除用户的操作即可。

三、实验案例——Shell脚本

? ? ? ? 实验描述

????????编写一个名为getarp.sh 的小脚本,记录局域网中各主机的MAC地址。

????????????????保存到/etc/ether文件中,若此文件已存在,应先转移进行备份。

????????????????每行一条记录,第1列为IP地址.第⒉列为对应的MAC地址。
????????编写一个名为scanhost.sh的扫描脚本,检查有哪些主机开启了匿名FTP服务,扫描对象为/etc/ether 文件中的所有IP地址,扫描的端口为21。

[root@lucky u3]# vim getarp.sh
#!/bin/bash
#定义网段地址、MAC列表文件
nadd="192.168.223."
file="/etc/ethers"
#发送ARP请求,并记录反馈结果
#备份原有文件 
[ -f $file ] && /bin/cp -f $file $file.old
#定义起始扫描地址
hadd=1 
while [ $hadd -lt 128 ]
do
   arping -I ens33 -c 2 ${nadd}${hadd} &> /dev/null
   if [ $? -eq 0 ] ; then
   arp -n | grep ${nadd}${hadd} | awk '{prink $1 $3}' >>$file
   fi 
   let hadd++
done
[root@lucky u3]# vim scanhost.sh
#!/bin/bash
target=$(awk '{print $1}' /etc/ethers)
echo "以下主机已开放匿名服务:"
for IP in $target
    do
    wget ftp://$IP/ &> /dev/null
     if [ $? -eq 0 ] ; then
     echo $IP
#删除测试产生的临时文件
    rm -rf index.html
    fi
done

文章来源:https://blog.csdn.net/zj2059129607/article/details/135135965
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。