使用python的paramiko加flask模块实现H3C设备实时ssh信息查询

1.本文主要初步实现一个通过Web实时查询H3C网络设备的终端MAC信息所在端口查询,这个是通过实际网络环境设计的操作逻辑,因而代码部分仅供参考

2.系统架构

The System Arch

主要是通过flask实现了一个Web界面,通过ajax调用后台接口,后台接口通过paramiko ssh模块在交换机上执行ssh命令,将结果处理后返回给前端Web的一个过程。

3.The code

(1)flask部分

from flask import Flask
from flask import render_template
from flask import request,jsonify
import sshsearch
from sshsearch import *

app = Flask(__name__)

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/testAjax', methods=['GET', 'POST'])
def testAjax():
    building = request.form['building']
    mac = request.form['mac']
    if building == 'A1' :
        hostname = '10.1.1.1'
        tag = 'v5'
    elif building == 'A2' :
        hostname = '10.1.1.2'
        tag = 'v5'
    elif building == 'A3' :
        hostname = '10.1.1.3'
        tag = 'v5'
    elif building == 'A4' :
        hostname = '10.1.1.4'
    elif building == 'B1' :
        hostname = '172.16.0.1'
        tag = 'v5'
    elif building == 'B2' :
        hostname = '172.16.0.2'
        tag = 'v7'
    res = swsearch(hostname,mac,tag)
    
    return jsonify(result = res)


if __name__ == '__main__':
    app.run(host='127.0.0.1', port=8010)

(2)paramiko部分

def swsearch(hostname,mac,tag) :
    tag = tag
    result_dic = {}
    if tag == 'v7' :
        hostname = hostname
        username = 'netadmin'
        password = 'Net!@#'
        paramiko.util.log_to_file('syslogin.log')     #发送paramiko日志到syslogin.log文件
        searchcmd = 'dis mac-address | include ' + mac    
        ssh = paramiko.SSHClient()          #创建一个SSH客户端client对象
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        ssh.connect(hostname=hostname,username=username,password=password,allow_agent=False,look_for_keys=False)    #连接汇聚交换机
        stdin,stdout,stderr = ssh.exec_command(searchcmd)      #调用远程执行命令方法exec_command()
        result1 = stdout.readlines()
        ssh.close()
        if len(result1) <= 8 :
            result_dic[1] = 'Not Found'
        else :
            i = 0
            j = 1
        for line in result1 :
            line = line.strip('\n')
            if i < 8 :
                i = i + 1
            else :
                tecmd = '\ndis lldp nei int G1/0/' + line[49:51] + ' verbose | include "Management address                :"\n'   #组成命令查看接入交换机IP地址的命令
                ssh = paramiko.SSHClient()
                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                ssh.connect(hostname=hostname,username=username,password=password,allow_agent=False,look_for_keys=False)   #连接汇聚交换机
                stdin,stdout,stderr = ssh.exec_command(tecmd)
                out1 = stdout.read()
                loc = out1.find(': ')  #在结果中定位交换机IP位置
                ip = out1[loc+2:loc+20].strip('\n')   #得到接入交换机IP
                ssh.close()
                ssh = paramiko.SSHClient()
                ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
                ssh.connect(hostname=ip,username=username,password=password,allow_agent=False,look_for_keys=False)  #连接接入交换机
                seccmd = 'dis mac-address | include ' + line[0:14]
                stdin,stdout,stderr = ssh.exec_command(seccmd)
                out2 = stdout.read()
                loc2 = out2.find('Eth')  #定位接入交换机结果所在行
                ssh.close()
                result2 = out2[loc2-8:loc2+15] #粗略定位接入交换机端口
                all_result = 'MAC: ' + line[0:14] + '\n' + 'Access Switch IP: ' + ip + '\n' + 'Port: ' + result2 + '\n' + 'VLAN: ' + line[17:21] + '\n' + 'BAGG: ' + line[49:51] + '\n'
                result_dic[j] = all_result 
                j = j + 1
                
    elif tag == 'v5' :
    ......

(3)具体代码已经放在github上面

4.总结
H3C设备操作系统有comware v5和comware v7两种,这两个系统虽然大体使用起来感觉差不多,但是具体到字符的返回以及操作指令的细节处还是有一些区别,在这次实现功能过程不得不打tag区分操作系统进行具体的处理。

所以国内的网络设置系统细节还是有待提高。