利用 pexpect 模块实现通过 CLI 自动化配置网络设备

本人工作需要经常配置出厂模式的防火墙,每次GUI上重复劳动。所以利用 python 的 expect 实现 pexpect 编写自动配置脚本,是通过 CLI 交互的。

此脚本是一开始配置 WAN 口的,因为此时没有配置 WAN IP,只能通过 console (实际 test bed 用的是 telnet )进行配置。以后的脚本直接通过

ssh 连接到 WAN 口。

#!/usr/local/bin/python

import pexpect
import time
import sys

#get port number
ipDict = {'10.0.0.66':'2029',
'10.0.0.25':'2011',
'10.0.0.20':'2043',
'10.0.0.61':'2022',
'10.0.0.64':'2025'}

usage = '''Usage: command WANIP
e.g. ./cfgWANIP.py 10.0.0.25'''

while True:
    if len(sys.argv) == 1:
        print usage
        sys.exit()
    elif sys.argv[1] == '-h' or sys.argv[1] == '--help':
        print usage
        sys.exit()
    elif len(sys.argv) != 2:
        print usage
        sys.exit()
    else:
        break

#telnet login (console login)
wanip = sys.argv[1]
port = ipDict[wanip]

child = pexpect.spawn("telnet 10.103.64.8 %s" % port)
child.logfile = sys.stdout
child.expect("login:")
child.sendline("admin")
child.expect("Password:")
child.sendline("password")
time.sleep(1)
child.sendline("")

while True:
    index = child.expect(["User", "admin@[A-Z0-9]{12}>"])
    if index == 0:
        child.sendline("admin")
        child.expect("Password:")
        child.sendline("password")
        child.expect("admin@[A-Z0-9]{12}>")
        child.sendline("configure terminal")
        break
    elif index == 1:
        child.sendline("configure terminal")        
        break
    else:
        print "Program error! Exit."
        sys.exit()

# login to UTM console, starting to configure WAN IP
child.expect("config\([A-Z0-9]{12}\)#")
child.sendline("interface X1")

child.expect("\(edit-interface\[X1\]\)#")
child.sendline("ip-assignment WAN static")

child.expect("\(edit-WAN-static\[X1\]\)#")
child.sendline("ip %s netmask 255.255.255.0" % wanip)

child.expect("\(edit-WAN-static\[X1\]\)#")
child.sendline("gateway 10.0.0.1")

child.expect("\(edit-WAN-static\[X1\]\)#")
child.sendline("dns primary 10.217.131.101")

child.expect("\(edit-WAN-static\[X1\]\)#")
child.sendline("exit")

child.expect("\(edit-interface\[X1\]\)#")
child.sendline("management https")

child.expect("\(edit-interface\[X1\]\)#")
child.sendline("management ssh")

child.expect("\(edit-interface\[X1\]\)#")
child.sendline("management ping")

child.expect("\(edit-interface\[X1\]\)#")
child.sendline("commit")

time.sleep(2)
child.close()

 

posted @ 2017-01-18 15:45  Alex_Xia  阅读(689)  评论(0编辑  收藏  举报