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测试主机是否在线。之前插入安装和准备秘钥。