赞
踩
网络工程师每天都需要巡检网络设备,或者临时接到一些任务,需要统计一些信息,比如每台设备的运行时间。如果是几台,十几台设备,熟练的工程师可能几分钟就完成了统计,但如果是成百上千台呢?此博文主要是以批量统计H3C网络设备的运行时间为例进行介绍展示,主要是复习expect模块的功能,复习shell编程参数的传递,复习sed、awk、grep等命令对文本的过滤、筛选和组合。关于expect模块安装和使用见博文Linux之使用expect备份华为交换机配置。
此巡检脚本主要依赖四个文件,分别是h3c_devices.txt、h3c_command.txt、ssh_remote_host.sh.bak、h3c_plxj.sh。
[root@s146 H3C_xj]# cat ssh_remote_host.sh.bak
#!/usr/bin/expect -f
#auto ssh login
set host [lindex $argv 0]
set user [lindex $argv 1]
set passwd [lindex $argv 2]
#set cmd [lindex $argv 3]
#if { $argc != 4 } {
# puts "请输入正确的参数!!!"
# puts "Usage: expect ./ssh_remote_host.sh ip user passwd cmd"
# exit 1
#}
set timeout 30
spawn ssh -l $user $host
expect {
"(yes/no)" {send "yes\r"; exp_continue}
"password:" {send "$passwd\r"}
}
expect ">" {send "system-view\r"}
expect "]" {send "line vty 0 4\r"}
expect "]" {send "screen-length 0\r"}
expect "]" {send "quit\r"}
expect "]" {send "quit\r"}
expect ">" {send "ABCMD\r"}
expect ">" {send "system-view\r"}
expect "]" {send "line vty 0 4\r"}
expect "]" {send "screen-length 24\r"}
expect "]" {send "quit\r"}
expect "]" {send "quit\r"}
expect ">" {send "quit\r"}
expect eof
#!/bin/bash
#script name: h3c_plxj.sh
#author: wuhs
#version: v1
#decription: 此脚本用于批量执行H3C设备的巡检,根据待巡检设备列表批量执行指定命令完成巡检
#decription: 此脚本示例为统计设备的运行时间
#decription: 脚本也可以执行指定巡检命令,收集命令相关信息
#参数定义
HostList=h3c_devices.txt
CmdList=h3c_command.txt
curdir=`cd -P $(dirname $0); pwd`
resultlog=h3c_plxj_result.log
cmd="display version | in uptime"
cd $curdir
rm -rf h3c_plxj_result.log
#判断是否存在巡检列表
if [ -s $HostList ];then
echo -e "巡检列表存在,`date +%F-%T`开始巡检" >> $resultlog
else
echo -e "待巡检列表文件不存在或者为空,请检查!" >> $resultlog
exit
fi
#判断是否存在巡检命令列表
if [ -s $CmdList ];then
while read line
do
ip=`echo $line | awk '{print $1}'`
user=`echo $line | awk '{print $2}'`
passwd=`echo $line | awk '{print $3}'`
while read line
do
cmd=$line
echo "$ip $cmd 检查结果如下:" >> $resultlog
cp ssh_remote_host.sh.bak ssh_remote_host.sh
sed -i "s/ABCMD/$cmd/g" ssh_remote_host.sh
chmod u+x ssh_remote_host.sh
./ssh_remote_host.sh $ip $user $passwd $cmd>> $resultlog
rm -rf ssh_remote_host.sh
done < $CmdList
done < $HostList
else
echo "待巡检命令为空,执行默认的统计设备uptime时间!" >> $resultlog
while read line
do
ip=`echo $line | awk '{print $1}'`
user=`echo $line | awk '{print $2}'`
passwd=`echo $line | awk '{print $3}'`
#echo "$ip $cmd 检查结果如下:" >> $resultlog
cp ssh_remote_host.sh.bak ssh_remote_host.sh
sed -i "s/ABCMD/$cmd/g" ssh_remote_host.sh
chmod u+x ssh_remote_host.sh
./ssh_remote_host.sh $ip $user $passwd $cmd > tmp.txt
uptime=`cat tmp.txt | grep -a "uptime is" |awk '{for (i=6;i<=NF;i++)printf("%s ", $i);print ""}'`
echo -e " $ip 运行时间 $uptime" >> $resultlog
rm -rf ssh_remote_host.sh
done < $HostList
echo -e "巡检结束,`date +%F-%T`" >> $resultlog
cat $resultlog
fi
[root@s146 H3C_xj]# mv h3c_devices.txt h3c_devices.tx
[root@s146 H3C_xj]# ./h3c_plxj.sh
待巡检列表文件不存在或者为空,请检查!
如果没有待巡检命令则执行统计设备运行时间,已经将日志结果进行了过滤和组合,可以通过excel的分列功能快速的把文本中的信息转换为表格。
实际上我们巡检的命令往往是固定的,需要查看的信息也是特定的,我们可以对日志信息进行过滤、筛查、组合得进一步加工只展示我们需要的内容。这个可以根据自己的需要进行优化和完善脚本。
可能有部分网友很奇怪为什么通过这种方式推送执行命令,原本我也是想直接通过shell的参数传递执行的,但是因为命令往往都是“display ip int bri”这种带空格的,带上双引号的情况下直接执行ssh远程脚本是OK的,返回结果也是正常的,但是通过脚本执行情况下$3获取的参数就变成了"display,经过一些尝试,没有解决,不得已采用了如下的方式。如果有清楚这个原因的朋友欢迎留言,望不吝指教!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。