54.shell脚本之for循环

mac2024-08-02  59

需求1:批量探测某个网段的主机存活状态,将存活的主机存入ok.txt文件中。

方式一: [root@web01 for]# cat for3.sh #!/usr/bin/bash for i in {1..254} do { ip=10.0.0.$i ping -W1 -c1 $ip &> /dev/null if [ $? -eq 0 ];then echo "$ip 存活" >>ok.txt fi }& done wait 方式二: [root@manager for]# cat for-07.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-07.sh #Description: ip=10.0.0. for n in `seq 1 254` do { ping -W1 -c1 $ip$n &>/dev/null rc=0 if [ $rc -eq 0 ];then echo "$ip$n 存活" fi }& done wait

需求2:判断主机存活状态,要求判断三次,如果三次失败则失败。

方式一: [root@web01 for]# cat for4.sh #!/usr/bin/bash ip=10.0.0. for i in `seq 1 254` do { ping -W1 -c1 $ip$i &> /dev/null if [ $? -eq 0 ];then echo "$ip$i 存活" >>yes.txt else for j in {1..3} do ping -W1 -c1 $ip$i &> /dev/null if [ $? -eq 0 ];then echo "$ip$j 存活" >>yes.txt else echo "$ip$j 不存活" >>err.txt fi done fi }& done wait 方式二: [root@manager for]# cat for-12.sh #!/bin/bash for i in {1..254} do { ip=10.0.0.$i ping -W1 -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip 存活" >> ok.txt else #如果判断第一次不存活,则在进行一次for循环,循环3for j in {1..3} do ping -W1 -c1 $ip &>/dev/null if [ $? -eq 0 ];then echo "$ip 存活" >> ok.txt else echo "$ip 不存活" >> err.txt fi done fi }& done wait

二、使用nmap

nmap localhost #查看主机当前开放的端口 nmap -p 1024-65535 localhost #查看主机端口(1024-65535)中开放的端口 nmap -PS 192.168.21.163 #探测目标主机开放的端口 nmap -PS22,80,3306 192.168.21.163 #探测所列出的目标主机端口 nmap -O 192.168.21.163 #探测目标主机操作系统类型 nmap -A 192.168.21.163 #探测目标主机操作系统类型 nmap --help #更多nmap参数请查询帮助信息

需求3:现在有一个ip.txt的文件,里面有很多IP地址。还有一个port.txt的文件,里面有很多端口号。现在希望对ip.txt的每个IP地址进行端口的探测,探测的端口号来源于port.txt文件中 最后将开放的端口和IP保存到一个ok.txt文件。

ip.txt port.txt 10.0.0.1 80 10.0.0.2 22 10.0.0.3 3306 10.0.0.4 23 10.0.0.5 443 10.0.0.6 9000 10.0.0.7 123 10.0.0.8 6379 10.0.0.9 10050 172.16.1.5 10051 192.168.10.1 172.16.1.6 [root@web01 for]# cat for6.sh #!/usr/bin/bash #遍历文件中的ip地址 for ip in $(cat ip.txt) do { #第二次循环,遍历文件中的端口号 for port in $(cat port.txt) do #探测ip与端口的存活状态 nc -vz -w 1 $ip $port &> /dev/null if [ $? -eq 0 ];then echo "$ip $port 端口已开放" else echo "$ip $port 端口未开放" >>er.txt fi done }& done wait

需求4:获取系统的所有用户并输出。效果如下:

This is 1 user: root This is 2 user: bin This is 3 user: daemon This is 4 user: adm ............... 1.怎么获取所有的用户 2.遍历/etc/passwd这个文件 3.如何让数字的编号进行 [root@manager for]# cat for-12.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-12.sh #Description: i=1 user=$(cat /etc/passwd |awk -F ":" '{print $1}') for ur in $user do echo "This is ${i} $ur" i=$[ $i +1 ] sleep 1 done

需求5:批量创建100个用户,比如输入cheng则会创建cheng01-100。

[root@manager for]# cat for-10.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-10.sh #Description: read -p "请输入创建用户的前缀:" qian #for user in {1..100} for user in $(seq -w 1 100) do if [ -z $qian ];then echo "请输入前缀" fi id $qian$user &> /dev/null if [ $? -ne 0 ];then useradd $qian$user if [ $? -eq 0 ];then echo "$qian$user is OK" fi else echo "$qian$user用户已存在" fi done

需求6:批量创建用户脚本,需要用户输入创建的用户数量,以及需要用户输入创建的前缀。例如:前缀cheng,个数10,代表创建cheng1~cheng10,总共10个用户。

[root@manager for]# cat for-11.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-11.sh #Description: . /etc/init.d/functions read -p "请输入创建用户的前缀:" qian if [ -z $qian ];then echo "请输入前缀,谢谢!" exit 1 fi read -p "请输入要创建几个用户:" num if [[ ! $num =~ ^[0-9]+$ ]];then echo "请输入整数" fi for i in $(seq "$num") do user=${qian}$i useradd $user &> /dev/null if [ $? -eq 0 ];then action "用户创建成功" /bin/true else action "用户创建失败" /bin/false fi done

需求7:批量创建用户脚本,需要用户输入创建的用户数量(必须是整数),同时还需要用户输入前缀(前缀不能为空)。

例如:前缀cheng,个数10,代表创建cheng1~cheng10,总共10个用户。 [root@manager for]# cat for-11.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-11.sh #Description: . /etc/init.d/functions read -p "请输入创建用户的前缀:" qian if [ -z $qian ];then echo "请输入前缀,谢谢!" exit 1 fi read -p "请输入要创建几个用户:" num if [[ ! $num =~ ^[0-9]+$ ]];then echo "请输入整数" fi for i in $(seq "$num") do user=${qian}$i useradd $user &> /dev/null if [ $? -eq 0 ];then action "用户创建成功" /bin/true else action "用户创建失败" /bin/false fi done

需求8:循环批量创建用户,需要填入用户的数量、用户的前缀、用户的统一密码(使用read、case、for语句)

[root@manager for]# cat for-13.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-11.sh #Description: . /etc/init.d/functions read -p "请输入创建用户的前缀:" qian if [ -z $qian ];then echo "请输入前缀,谢谢!" exit 1 fi read -p "请输入要创建几个用户:" num if [[ ! $num =~ ^[0-9]+$ ]];then echo "请输入整数" fi for i in $(seq "$num") do user=${qian}$i useradd $user &> /dev/null if [ $? -eq 0 ];then action "用户创建成功" /bin/true else action "用户创建失败" /bin/false fi echo "123" |passwd --stdin $user &> /dev/null if [ $? -eq 0 ];then action "增加密码成功" /bin/true else action "设置密码失败" /bin/false fi done

需求9:通过读入文件中的用户,进行批量添加用户。

[root@manager for]# cat for-15.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-15.sh #Description: for user in $(cat user.txt) do useradd $user done

需求10:通过读入文件中的用户与密码文件,进行批量添加用户。文件中的格式: user:passwd

[root@manager for]# cat for-16.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-16.sh #Description: for user in $(cat user.txt) do us=$(echo $user |awk -F ":" '{print $1}') pw=$(echo $user |awk -F ":" '{print $2}') id $us &> /dev/null if [ $? -eq 0 ];then continue else useradd $us echo "$pw" | passwd --stdin $us &> /dev/null echo "$us is create ok......" fi done

需求11: 批量创建用户,用户名cheng01-100 密码随机(8~12), 然后将创建成功的用户名及密码写入到一个文件中.

mkpasswd -l cheng01:dasd1#!@#!@dsa cheng02:dascxasdas1!@# [root@manager for]# cat for-17.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-17.sh #Description: . /etc/init.d/functions i=8 read -p "请输入你需要创建用户的前缀:" qian if [ -z $qian ];then echo "不能输入回车" exit fi for user in {1..10} do id $qian$user &> /dev/null if [ $? -ne 0 ];then useradd $qian$user mkpasswd -l $i i=$[ $i +1 ] echo "$qian$user:$(mkpasswd -l $i)" >> pass.txt echo "$qian$user 创建成功" fi done

需求12:使用case实现批量删除用户。

1.提示用户输入需要删除的用户以及删除的个数。 2.如果用户存在则删除,如果不存在则提示no such user。 [root@manager for]# cat userdel.sh #!/bin/bash #Date: 2019-10-31 #FileName: userdel.sh #Description: read -p "请输入删除用户的前缀:" qian if [ -z $qian ];then echo "请输入用户前缀" fi read -p "请输入你要删除几个:" num if [[ ! $num =~ ^[0-9]+$ ]];then echo "请输入数字" exit fi for user in {1..100} do id $qian$num &> /dev/null if [ $? -eq 0 ];then userdel $qian$user echo "$qian$user 删除成功" else echo "$qian$user no such user" fi done

需求13:查看当前系统已使用内存的百分比,如果以使用的内存占比超过50%则将后台运行的服务列出来,并让用户选择保持不变或者关掉某个服务,后再次显示使用内存的百分比,若还超过50%,则重复上述操作

需求14:使用for循环备份mysql库,每个库对应一个sql文件,需要排除没用的。

1.如何拿到所有的库名称 wordpress jpress zabbix zrlog 2.循环拼接备份命令 mysqldump -uroot -pcheng.com -B zabbix >/mysql/data/zabbix.sql [root@db01 ~]# cat mysql-db.sh #!/usr/bin/bash db_path=/backup/mysql date_time=$(date +%F) db_name=$(mysql -uroot -e "show databases" |sed 1d |egrep -v "*_schema|test|mysql") [ -d $db_path ] || mkdir -p $db_path for i in $db_name do mysqldump -uroot -B ${i} > $db_path/${i}_${date_time}.sql if [ -f $db_path/${i}_${date_time}.sql ];then echo "$i backup is OK....." else echo "$i backup is error...." fi done #保留最近180天的数据 if [ -f $db_path/$date_time/day.txt ];then touch $db_path/$date_time/day.txt find $db_path -type f -mtime +180 -delete > $db_path/$date_time/day.txt fi

需求15:使用for嵌套循环实现分库分表备份。

[root@db01 ~]# cat mysql-backup.sh #!/usr/bin/bash db_path=/backup/mysql date_time=$(date +%F) db_name=$(mysql -uroot -e "show databases;" |sed 1d |egrep -v "*_schema|mysql|test") #1.准备备份的目录 [ -d $db_path ] || mkdir -p $db_path #2.获取所有的库名称 for i in $db_name do #3.获取对于库的所有表 db_table=$(mysql -uroot -e "use $i; show tables" |sed 1d) for j in $db_table do [ -d $db_path/$i/$date_time ] || mkdir -p $db_path/$i/$date_time mysqldump -uroot $i $j >$db_path/$i/$date_time/${j}.sql done done

需求16:编写一个上课随机点名脚本。

[root@manager for]# cat for-20.sh #!/bin/bash if [ -s name.txt ];then User=$(sort --random-sort name.txt |awk 'NR==1') echo "$User" grep $User name.txt >> name1.txt sed -i '/'$User'/d' name.txt else cat name1.txt>name.txt rm -rf name1.txt fi [root@manager for]# cat for-20.sh #!/bin/bash #1.只循环20次 for i in {1..20} do #统计一下名单中的行号 line=$(cat name.txt|wc -l) #设定一个随机的变量值,但这个值不能超过文件名单的行号 sj=$(( ${RANDOM}%$line+1 )) # 循环20次,打印20次名单 echo -e " $(sed -n "${sj}p" name.txt) " sleep 0.1 done sj=$(( $sj + 1 )) username=$(sed -n "${sj}p" name.txt) echo -e 这次回答问题的是: "\033[32m $username \033[0m" 同学。

需求17: 写一个倒计时脚本.

[root@manager for]# cat for-19.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-19.sh #Description: for i in {9..1} do echo -ne "$i\b" sleep 1 done echo -e "\b hello world" [root@manager for]# cat for-19.sh #!/bin/bash #Date: 2019-10-31 #FileName: for-19.sh #Description: for i in {10..1} do echo -n -e "最后倒计时: $i \r" sleep 1 done

需求18:抓取https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/页面中的所有rpm包 wget

[root@manager for]# cat for-24.sh #!/bin/bash #1.获取网页的源代码 #2.对网页源代码进行过滤筛选,提取文件名称 #3.将下载的url和文件名称拼接,通过wget下载 Url_File=url.txt Pkg_Name=$(grep "<a href=" $Url_File | awk -F '"' '{print $2}' | egrep -v "debuginfo|repodata|\.\./") Get_Url=https://mirrors.aliyun.com/zabbix/zabbix/4.0/rhel/7/x86_64/ for package in $Pkg_Name do #完整的下载url地址 url_package=$Get_Url$package #指定下载至某个目录 wget -O /mnt/$package $url_package &>/dev/null #判断下载是否正常 if [ $? -eq 0 ];then echo "软件包: $pkg is ok..." fi done

需求1:使用while读入文件方式,批量创建用户

[root@manager while]# cat while-3.sh #!/usr/bin/bash while read user do id $user &> /dev/null if [ $? -ne 0 ];then useradd $user echo "$user用户创建成功" else echo "$user用户已存在" fi done<user.txt

需求2:使用while读入文件方式,批量创建用户以及密码

[root@manager while]# cat while-4.sh #!/usr/bin/bash while read user2 do user=$(echo $user2|awk '{print $1}') pass=$(echo $user2|awk '{print $2}') id $user &> /dev/null if [ $? -ne 0 ];then useradd $user &> /dev/null echo "$pass" |passwd --stdin $user if [ $? -eq 0 ];then echo "$user 用户创建成功" fi else echo "$user 用户已存在" fi done<user2.txt

需求3:猜数字游戏

[root@manager ~]# cat cs.sh #!/usr/bin/bash sj=$[$RANDOM%100+1] i=1 while true do read -p "请输入你要猜的数字:" Action if [ $Action -eq $sj ];then echo "恭喜你猜对了" break elif [ $Action -lt $sj ];then echo "你猜小了" elif [ $Action -ge $sj ];then echo "你猜大了" fi let i++ done echo "你总共猜了$i 次,失败了 $[$i -1] 次"
最新回复(0)