Linux shell编程自动化运维 循环 解析

编程自动化运维   shell 专栏收录该内容
12 篇文章 0 订阅

for循环

for  语法结构
#! /bin/bash
for  变量名  [in 取值列表]
do
循环体
done

示例↓↓↓↓   自动创建十个用户

for  i   in {1..10}
do
useradd   "user$i"
done

变量值用一下方式也可以
for   i   in $i(seq  1 10)
for   i   in  `seq 10`

while // until循环

特点 循环次数不一定是固定的
一,while循环解析
while语句结构(死循环,逐行处理文件)

#! /bin/bash
while    条件测试
do
         循环体
done

☝☝当条件测试成立 (条件测试为真,执行循环体)

示例↓↓↓↓ 每秒显示一个数字,一次递增+1

#! /bin/bash
while
do
let  i++
sleep  1        //停顿一秒
echo   $i
done

示例1:ping测试主机
1 编写常规的网络测试脚本

 #! /bin/bash
 #ping
 ip = 192.168.100.10         
ping -c1  -W1  $ip  &>  /dev/null
 if  [ $?  -eq 0 ] ;  then
 echo  "$ip"  |   tee -a  想要写入的文件名
 fi

2 使用添加循环语句,for i in {3…255}

#! /bin/bash
#ping
for   i  in  {3..255}
ip = 192.168.100.$i
ping  -c1  -W1 $ip &> /dev/null
if [ $? -eq 0 ] ;then
echo "$ip" | tee -a 想要写入的文件名
fi
done

3 优化脚本(后台执行,清空脚本,循环完成提示,wait间隔)

#! /bin/bash 
#ping 
  >输入的文件名       //清空记录文本
for i in {3..255}
do
{
ip = 192.168.100.$i
ping -c1 -W1 $ip &> /dev/null
if [ $? -eq 0 ] ; then
echo "$ip" | tee -a 记录能Ping通IP的文件
fi
}  &      // & 后台运行的意思
done
wait      //等待前一个程序执行完毕,再执行下一个编程命令
echo "运行成功...."    

案例二
案例2 :通过用户列表文件创建用户
创建一个文件,里面写入一些想要创建的用户名

#! /bin/bash
for user in ` cat  用户名 `
do 
useradd $user
echo " $user is creatad"
done

升级案例2:用户可以使用参数的形式,自定义用户名文件,
如果用户没有输入用户名文件,提示用户输入,
如果用户输入的不是文件,提示用户更正
启动循环创建用户
如果用户已经存在,提示存在
如果用户不存在,则创建成功,提示成功

#! /binbash
#name
#time
pass = 123
#判断脚本是否有参数

案例三
案例3:使用for实现批量主机root密码的修改
提前配置1:已经完成秘钥登入配置(ssh-keygen)
配置2:定义主机地址列表
配置3:了解远程修改密码的方法

免密登入
ssh -keygen
ssh-copy-ip ip地址

邀请用户输入秘密
并修改文本里IP地址的root登入

#! /usr/bin/bash
read -p 请输入您想改的密码: " pass    
for ip in  `at 记录IP的文件名`
do 
		ping -c1 -W1 $i &> /dev/null
		if [ $? -eq 0 ]
	then
		ssh $i "echo $pass | passwd  --stdin root"
		echo $i  >>   存放修改密码成功IP的文件名
	else
		echo  $i  >>  存放修改密码不成功IP的文件名
		fi
done

美化脚本案例三(后台执行,隐藏密码输入,判断密码是否一致)

▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃▃

until语法结构

until 条件测试
do
循环体
done

☝☝☝☝条件测试成立(条件测试为假,视为成立

示例1 ↓↓↓ 每一秒循环一个数字 Ctrl+c 可结束程序

#!/bin/bsah
until  [[ $i -eq 14 ]]
do
let   i++
sleep   1
echo    $i
done

示例2↓↓↓ 每1秒查看某用户是否在线

#! /bin/bash
until who  | grep "^用户名“ &> /dev/null
do
echo "$(date) 用户名 并不在线
sleep 1
done
echo "用户名  已在线”
exit 0

循环总结
固定: for
逐行: while
逐行/不固定: while     until

·

·
expect

可以避免交互,自动交互,
期待,预期,盼望,预料,料想,指望,希望,要求,想,认为
                 解决人机交互的问题
一、概述
  我们通过Shell可以实现简单的控制流功能,如:循环、判断等。但是对于需要交互的场合则必须通过人工来干预,有时候我们可能会需要实现和交互程序如telnet服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
  Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。Expect的作者Don Libes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件 (Expect [is a] software suite for automating interactive tools)。使用它系统管理员 的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说这些输入都需要手工输入进行的。 Expect则可以根据程序的提示模拟标准输入提供给程序需要的输入来实现交互程序执行。甚至可以实现实现简单的BBS聊天机器人。😃
  Expect是不断发展的,随着时间的流逝,其功能越来越强大,已经成为系统管理员的的一个强大助手。Expect需要Tcl编程语言的支持,要在系统上运行Expect必须首先安装Tcl。
  二、Expect工作原理
  从最简单的层次来说,Expect的工作方式象一个通用化脚本工具。用来实现计算机之间需要建立连接时进行特定的登录会话的自动化。
 脚本由一系列expect-send对组成:expect等待输出中输出特定的字符,通常是一个提示符,然后发送特定的响应。

安装程序与插件:

yum -y install  expect tcl tclx tcl-devel

通过expect解决ssh交互问题
expect程序编写脚本
示例一

#! /usr/bin/expect
		apawn ssh root@IP地址
				expect{
		"yes/no" { send "yes\r" ; exp_continue}
		"password: "  {send "IP地址的密码\r" };
					}
					interact

expect脚本 解析☝☝☝☝

spawn       //expect内部命令,启动一个shell程序
expect       //期望哪些内容
yes/no       //用send发送 yes ,\r    //表示回车键
password      //用send发送写入的密码
exp_continue     //如果没碰到这句话,就跳过,继续进行下一条语句
interact           //允许用户交互,保留会话

示例二
准备工作:安装expect,准备公钥
1 通过shell循环判断在线主机

#! /bin/bash 
>ip.txt
>for i in {3..355}
>do
>{
>ip=192.168.100.10
>ping -c1 -W1 $ip &> /dev/null
>if [$? -eq 0 ] ; then
>echo "$ip"  >>ip.txt          //将能ping通的IP写进ip.txt文件内
>fi
>}  &
>done

2,通过expect进行交互

#! /bin/bash
>ip.txt            
for i in {3..255}
do
{
ip=192.168.100.$i
ping  -c1  -W1  $ip  &> /dev/null
if [ $? -eq 0 ] ; then
echo "$ip" >>ip.txt

/usr/bin/expect <<-EOF
set timeout 10           //超时10秒,等待十秒
spawn ssh -copy-id  $ip
expect  {
"yes/no"  { send "yes\r" ; exp_continue }     //continue 跳过,下一条
"password: " { send "密码\r" }
}
expect eof
EOF
fi
} &
done
wait
echo "finishi.."

安装expect服务和秘钥
示例

#! /bin/bash
>ip.txt
rpm -q expect  &> /dev/null
if [ $? -ne 0 ]; then
yum install -y expect
fi
if [ ! -f ~/.ssh/id_rsa ] ; then
ssh-keygen -p "" -f ~/.ssh/id_rsa
fi
sleep

练习作业

1,用case判断成绩

#!/bin/bash
read -p "请输入你考试的分数:" jio	
case "$jio" in
[0-9])
	echo "您没有及格,请下次努力!"
;;
[1-5][0-9])
	echo "您没有及格,请下次努力!"
 ;;
[6-7][0-9])
	echo "您的成绩及格,请更加努力!"
 ;;
[8-9][0-9])
	echo "您的成绩为优秀,请再接再厉!"
 ;;
100)
	echo "您的成绩为优秀,请再接再厉!"
 ;;
*)
	echo "您输入的成绩超出合理值,请重新输入!"
;;
esac

2,双网关自动切换       //解析

#!/bin/bash
gw1=192.168.10.253
gw2=192.168.10.251
(
while :      //条件恒真,进入死循环
do
	route del default
	route add default gw $gw1     //删除默认网关,并设gw1为默认网关。这两个命令主要是为了第二个循环结束后进行的操作
	while ping -c 1 $gw1 &> /dev/null //测试能否ping通主网关。while循环是测试条件成立会继续循环,即继续ping下去
do
	sleep 1   //ping成功会休眠一秒
done              //ping不通结束循环
	route del default
	route add default gw $gw2   //第一个循环结束后进行的操作,删除默认网关,并将gw2设为默认网关
	until ping -c 1 $gw1 &> /dev/null  //进入第二个循环继续ping主网关。until循环是测试条件不成立会继续循环,即ping不通继续ping
do
sleep 1
done   //ping通了就结束循环,又重新进入死循环进行的操作。就是删除默认网关,并gw1为默认网关
done
) &     //将脚本里的命令加入后台执行

·
·
·
排查错误
解释器  -xv  文件名
例如
bash -xv   文件名
expect  -xv  文件名

  • 1
    点赞
  • 1
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论 1 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页

打赏作者

是鑫磊吖~

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值