shell循环

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

编写常规网络测试脚本

#!/bin/bash#pingip=192.168.100.10ping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfi

因为测试对象多,所以使用循环。

#!/bin/bash#pingfor i  in {2..254}doip=192.168.100.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfidone

优化脚本(后台执行,清空脚本,wait间隔)

#!/bin/bash#ping>ip.txt		##清空记录文本for i  in {2..254}do{ip=192.168.100.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ] ;thenecho "$ip" |tee -a ip.txtfi}&##后台执行donewait##等待前一个程序执行完毕。在执行下一个命令。echo "finishi...."通过用户列表文件创建用户#!/bin/bash#name#timepass=123#判断脚本是否有参数if [ $# -eq 0 ] ;thenecho "usage:$0 filename "exit 1fi#判断用户输入的是否是文件if [ ! -f $1 ];thenecho "error filename"exit 2fi#设置循环,读取文件,创建用户for user in `cat $1`doid $user &> /dev/null#如果用户不存在,则创建用户,否则提示已经存在。if [ $? -eq 0 ];thenecho "user $user already exists"elseuseradd $userecho "$pass" | passwd --stdin $user &> /dev/null#判断用户是否创建成功,并提示if [ $? -eq 0 ] ; thenecho "$user is created."fifidone

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

邀请用户输入新密码

#!/bin/bashread -p "请用户输入新密码: "  password#循环调用IP地址for i in $(cat ip.txt)do{#测试IP是否在线ping -c1 -W1 $i &> /dev/null#在线IP进行修改if [ $? -eq 0 ] ;then#修改密码ssh  $i  "echo $password | passwd --stdin root"#修改成功与否并记录if  [ $? -eq 0    ] ;thenecho "$i" >>  ok.txtelseecho $i  >> fail.txtfi#不在线的主机记录。elseecho $i >> meigai.txtfi} &done

  • while until 循环次数不[一定]是固定的
  • while 语句结构(死循环/逐行处理文件)
while 条件测试do循环体done当条件测试成立(条件测试为真),执行循环体

#!/bin/bashwhile :dolet i++sleep 1echo $idone

  • until语法结构
until 条件测试do循环体done当条件测试成立(条件测试为假视为成立),执行循环体

#!/bin/bashuntil  [[ $i -eq 14 ]]dolet i++sleep 1echo $idone

  • expect

我们通过Shell可以实现简单的控制流功能,但对于需要交互的场合则必须通过人工操作,有时候我们可能会需要实现和交互程序如ssh服务器等进行交互的功能。而Expect就使用来实现这种功能的工具。
Expect是一个免费的编程工具语言,用来实现自动和交互式任务进行通信,而无需人的干预。

yum install     -y expect tcl tclx tcl-devel        安装

通过expect解决ssh交互问题

通过expect编写脚本

#!/usr/bin/expectspawn ssh root@192.168.0.111expect {"yes/no" { send "yes\r";exp_continue }"password:" { send "666666\r" };}interact

登录验证免交互

expect 期望哪些内容
password 就send发送 centos
yes/no 就send发送 yes ,\r 表示回车
interact 允许用户交互
spawn expect 内部命令,启动一个shell程序。
exp_continue,跳过循环,就继续下一条语句。

expect例子:公钥推送
准备工作:安装expect,准备公钥
通过shell循环判断在线主机

#!/bin/bash#创建一个IP地址文件。>ip.txt#使用for循环ping测试主机是否在线。for i in {2..254}do{#请注意环境的IP地址,可能与示例中不同。ip=192.168.0.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip" >> ip.txtfi}&donecat  ip.txt 观察在线主机

通过expect进行交互

#!/bin/bash#创建一个IP地址文件。>ip.txt#使用for循环ping测试主机是否在线。for i in {2..254}do{#请注意环境的IP地址,可能与示例中不同。ip=192.168.122.$iping -c1 -W1 $ip &> /dev/nullif [ $? -eq 0 ];thenecho "$ip" >> ip.txt

        /usr/bin/expect <<-EOFset timeout 10
spawn ssh-copy-id $ipexpect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "centos\r" }}expect eof
EOFfi}&donewaitecho "finishi..."#!/usr/bin/expectset timeout 10
spawn ssh-copy-id 192.168.122.152expect {"yes/no" { send "yes\r"; exp_continue }"password:" { send "centos\r" }}

#!/bin/bash#创建一个IP地址文件。>ip.txt#检测expect是否安装,检测公钥是否创建。rpm -q expect &> /dev/nullif [ $? -ne 0 ] ;thenyum install -y expectfiif [ ! -f ~/.ssh/id_rsa ];thenssh-keygen -P "" -f ~/.ssh/id_rsafi#使用for循环ping测试主机是否在线。之前插入安装和准备秘钥。