在日常工作中,有时候会遇到需要批量操作多台交换机的情况。而交换机普遍是采用定制系统,默认是telnet登陆,即使换成ssh登陆也无法使用ansible进行统一管理,所以通过python telnetlib库实现了交换机的批量管理(交换机型号为思科2960x)
实现代码如下:
switch_telnet.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | #encoding=utf-8 import sys import telnetlib import time def tel(ip,user,password): tn = telnetlib.Telnet(ip,port=23) tn.read_until('Verification\r\n\r\nUsername: ') tn.write(user+'\n') # tn.set_debuglevel(2) #password tn.read_until('Password: ') tn.write(password+'\n') #login fail if tn.read_some()=='\r\nPassword: ': print '\033[1;31;40m'+ip+'\033[0m'+' password is wrong,login false!' tn.close() return 1 #login successs tn.write('enable\n') #password tn.read_until('Password: ') tn.write(password+'\n') #enable susccess set terimal length tn.read_until('Switch#') tn.write('ter len 0\n') time.sleep(1) if tn.read_some()=='ter len 0\r\nSwitch#': print ip+' telnet login susccess' return tn print ip+' terminal length 0 false!' return 1 def comm(tn,ip,cmd): tn.write(cmd+'\n') time.sleep(.2) result = tn.read_very_eager() print ('\033[1;31;40m'+ip+'\033[0m'+' '+result) ip_list = [] user_list = [] password_list = [] tn = [] ip_fp = open('ip_list','r') ip_fs = ip_fp.read() ip_fp.close() fa = ip_fs.split('\n') for i in range(0,len(fa)-1): f_res = fa[i].split(',') ip_list.append(f_res[0]) user_list.append(f_res[1]) password_list.append(f_res[2]) for i in range(0,len(fa)-1): tn.append(tel(ip_list[i],user_list[i],password_list[i])) while 1: cmd = raw_input("input the command: ") if cmd == 'quit': for i in range(0,len(fa)-1): tn[i].write('quit\n') break for i in range(0,len(fa)-1): comm(tn[i],ip_list[i],cmd+'\n') |
脚本详解:
主要使用了python的telnetlib库,下面概述常见的几个方法。
telnetlib.Telnet([host[, port[, timeout]]])
此方法返回一个client对象,可操作
Telnet.read_until(expected[, timeout])
此方法阻塞读取缓存区输出,匹配expected才继续
Telnet.read_all()
读取所有输出,读取到结束符或者连接中断
Telnet.read_some()
读取至少一个输出
Telnet.read_very_eager()
读取尽量多的输出,但记得要time.sleep()一定时间,不然会因为来不及读取所有数据导致数据丢失
Telnet.write(buffer)
向client对象写入数据,记得换行符\n
Telnet.close()
关闭连接
操作指南:
使用时在同路径下编辑ip_list文件,格式为ip,username,password既可,一个交换机占一行,如下例:
1 2 | 10.32.19.9,cisco,123456 10.32.19.10,cisco,654321 |
运行 python ./switch_telnet.py
显示所有交换机IP的登陆情况,然后输入命令交互即可(类似ansible)
可以随意使用exit命令,但直接退出脚本指令为quit
其他:
同类可用库还有pexpect,非常强大
如果是SSH登陆的交换机,可以使用netmiko,还可以用fabric批量管理,不再赘述
项目源码已上传github
https://github.com/calmkart/switch_telnet