Shell脚本之H3C网络设备批量巡检

一、需求说明

  网络工程师每天都需要巡检网络设备,或者临时接到一些任务,需要统计一些信息,比如每台设备的运行时间。如果是几台,十几台设备,熟练的工程师可能几分钟就完成了统计,但如果是成百上千台呢?此博文主要是以批量统计H3C网络设备的运行时间为例进行介绍展示,主要是复习expect模块的功能,复习shell编程参数的传递,复习sed、awk、grep等命令对文本的过滤、筛选和组合。关于expect模块安装和使用见博文Linux之使用expect备份华为交换机配置

二、脚本内容

  此巡检脚本主要依赖四个文件,分别是h3c_devices.txt、h3c_command.txt、ssh_remote_host.sh.bak、h3c_plxj.sh。

  • h3c_devices.txt是待巡检设备列表,按照IP 用户名 密码的方式逐行写入到此文件中,如果此文件为空或者不存在则退出程序;
  • h3c_command.txt是待巡检命令,逐行写入完整的可执行命令到此文件中,如果此文件为空则统计列表中设备的运行时间;
  • ssh_remote_host.sh.bak是ssh远程登录脚本,巡检每台设备时单独调用;
  • h3c_plxj.sh是巡检脚本主文件,会执行一些判断和巡检日志结果的处理,此脚本只对设备的运行时间统计进行了处理了,如果固定的巡检要求,还可以根据日志内容自行加工进一步处理,简化运维巡检统计工作。

1、ssh远程登录设备脚本

[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

2、H3C网络设备巡检主脚本

#!/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

三、使用示例

1、如果不存在待巡检设备列表

[root@s146 H3C_xj]# mv h3c_devices.txt h3c_devices.tx
[root@s146 H3C_xj]# ./h3c_plxj.sh
待巡检列表文件不存在或者为空,请检查!

2、如果不存在待巡检命令列表

  如果没有待巡检命令则执行统计设备运行时间,已经将日志结果进行了过滤和组合,可以通过excel的分列功能快速的把文本中的信息转换为表格。

在这里插入图片描述

3、根据巡检命令列表命令采集信息

  实际上我们巡检的命令往往是固定的,需要查看的信息也是特定的,我们可以对日志信息进行过滤、筛查、组合得进一步加工只展示我们需要的内容。这个可以根据自己的需要进行优化和完善脚本。
在这里插入图片描述

四、留在最后

可能有部分网友很奇怪为什么通过这种方式推送执行命令,原本我也是想直接通过shell的参数传递执行的,但是因为命令往往都是“display ip int bri”这种带空格的,带上双引号的情况下直接执行ssh远程脚本是OK的,返回结果也是正常的,但是通过脚本执行情况下$3获取的参数就变成了"display,经过一些尝试,没有解决,不得已采用了如下的方式。如果有清楚这个原因的朋友欢迎留言,望不吝指教!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/carefree2005/article/details/124821845