shell编程及自动化运维--循环
循环
1、Shell循环:for
(1)语法结构
for 变量名 [ in 取值列表 ]
do
循环体
done示例
- for i in {1…10}
do
useradd “user$i”
done
(2)ping测试主机
- 需求:通过循环工具,探测全网主机。将在线主机记录在文本中
- 示例
1 编写常规网络测试脚本
#!/bin/bash
#ping
ip=192.168.100.10
ping -c1 -W1 $ip &> /dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ] ;then echo " ?−eq0];thenecho"ip" |tee -a ip.txt
fi2 因为测试对象多,所以使用循环。
#!/bin/bash
#pingfor i in {2…254}
doip=192.168.100.$i
ping -c1 -W1 $ip &> /dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ] ;then echo " ?−eq0];thenecho"ip" |tee -a ip.txt
fidone
3 优化脚本(后台执行,清空脚本,wait间隔)
#!/bin/bash
#ping》ip.txt ##清空记录文本
for i in {2…254}
do
{
ip=192.168.100.$i
ping -c1 -W1 $ip &> /dev/null
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ] ;then echo " ?−eq0];thenecho"ip" |tee -a ip.txt
fi
}& ##后台执行
done
wait ##等待前一个程序执行完毕。在执行下一个命令。
echo “finishi…”
(3)通过用户列表文件创建用户
- 需求:用户可以使用参数的形式,自定义用户名文件。
如果用户没有输入用户名文件,提示用户输入
如果用户输入的不是文件,提示用户更正。
启动循环创建用户
如果用户已经存在,提示存在
如果用户不存在,则创建成功,提示成功 - 示例
- #!/bin/bash
#name
#time
pass=123
#判断脚本是否有参数
if [ $# -eq 0 ] ;then
echo “usage:$0 filename "
exit 1
fi
#判断用户输入的是否是文件
if [ ! -f $1 ];then
echo “error filename”
exit 2
fi
#设置循环,读取文件,创建用户
for user in `cat $1``
do
id $user &> /dev/null
#如果用户不存在,则创建用户,否则提示已经存在。
if [ $? -eq 0 ];then
echo “user $user already exists”
else
useradd u s e r e c h o " user echo " userecho"pass” | passwd --stdin $user &> /dev/null
#判断用户是否创建成功,并提示
if [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ] ; then echo " ?−eq0];thenecho"user is created."
fi
fi
done
(4)使用for实现批量主机root密码的修改
- 完成秘钥登录配置(ssh-keygen—在129免密登录134)
- 两台centos:192.168.142.134 192.168.142.129:跳板机
- ssh-keygen //在129生成秘钥
- ssh-copy-id 192.168.142.134 //将129生成的秘钥传递给134
- 输入134密码即可
- ssh root@192.168.142.134
- 步骤
- 邀请用户输入密码
- 循环调用IP地址
- 执行远程修改(ssh 192.168.122.20 “touch ~/ddd.txt”)
- 记录执行结果
- 示例
- #邀请用户输入新密码
read -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 [ ? − e q 0 ] ; t h e n e c h o " ? -eq 0 ] ;then echo " ?−eq0];thenecho"i” >> ok.txt
else
echo $i >> fail.txt
fi
#不在线的主机记录。
else
echo $i >> meigai.txt
fi
} &
done
2、Shell循环:while until
(1)while语句结构
- 语法结构
- while 条件测试
do
循环体
done
==当条件测试成立(条件测试为真),执行循环体
- 示例
- 每秒显示一个数字,一次递增+1
while :
do
let i++
sleep 1
echo $i
done
(2)until语法结构
- 语法结构
- until 条件测试
do
循环体
done
==当条件测试成立(条件测试为假视为成立),执行循环体
- 示例
- #!/bin/bash
until [[ $i -eq 14 ]]
do
let i++
sleep 1
echo $i
done
3、expect
- 安装:yum install -y expect tcl tclx tcl-devel
- 示例1:通过expect解决ssh交互问题
#!/usr/bin/expect
spawn ssh root@192.168.0.111expect {
“yes/no” { send “yes\r”;exp_continue }
“password:” { send “666666\r” };
}
interactspawn expect 内部命令,启动一个shell程序。
expect 期望哪些内容
yes/no 就send发送 yes ,\r 表示回车
exp_continue,跳过循环,就继续下一条语句。
interact 允许用户交互
4、总结
- 使用case实现成绩优良差的判断
- for创建20用户
用户前缀由用户输入
用户初始密码由用户输入
例如:test01,test10 - for ping测试指网段的主机
网段由用户输入,例如用户输入192.168.2 ,则ping 192.168.2.10 — 192.168.2.20
UP: /tmp/host_up.txt
Down: /tmp/host_down.txt - 使用for实现批量主机root密码的修改
成功或失败都必须记录
提示:主机IP存放在一个文件中
SSH:实现公钥认证,执行远程中主机命令
实现公钥认证
#ssh-keygen 在用于管理的主上生成密钥对
#ssh-copy-id -i 192.168.2.3
- 示例
- #!/bin/bash
read -p “请输入你考试的分数:” score
case “$score” in
【0-59】)
echo “您没有及格,请下次努力!”
;;
【60-79】)
echo “您的成绩及格,请更加努力!”
;;
【80-89】)
echo “您的成绩为良好,请再接再厉!”
;;
【90-100】)
echo “您的成绩为优秀,请再接再厉!”
;;
*)
echo “您输入的成绩超出合理值,请重新输入!”
;;
esac
更多相关文章
- jQuery常用操作; jQuery中的$.ajax方法; Vue基本术语与插值语法---
- 个人用户怎样选择最适合的阿里云服务器?
- 关于修改密码带特殊符号以及数据泵参数设置的一些小知识(2)
- 侵害10亿用户隐私,QQ、小米金融、搜狐新闻等41款App被通报
- 用户表空间配额(User tablespace Quota)
- 一种新的Android恶意软件HiddenMiner,影响印度和中国的用户
- 一步一步搭建11gR2 rac+dg之DG 机器配置(七)
- Servlet过滤器使用实例(防止用户恶意登录)
- 神策数据张涛:微信生态数字化运营解决方案