需求:自动登录到交换机或路由器,抓取acl规则命中统计信息。
Python可以使用telnetlib来方便的完成与网络设备的telnet交互,先看个简单的demo。
-
import sys
-
import telnetlib
-
-
HOST = "localhost"
-
user = raw_input("Enter your remote account: ")
-
password = raw_input("Enter your password: ")
-
-
tn = telnetlib.Telnet(HOST)
-
-
tn.read_until("login: ")
-
tn.write(user + "n")
-
if password:
-
tn.read_until("Password: ")
-
tn.write(password + "n")
-
-
tn.write("lsn")
-
tn.write("exitn")
-
-
print tn.read_all()
这样就可以获取远程设备上的信息了,很简单。不过这里可能有个问题,就是当输出信息比较多时,如:
-
#show security acl-group hits global
-
-
Rule Interface Hits Total Percentage
-
-------------------------------------------------------------------------
-
1 pos192_6/12 0 838241480577 0.00%
-
pos192_6/11 155468324 604476632172 0.03%
-
pos192_6/10 0 829312701821 0.00%
-
pos192_6/9 145907985 559951471369 0.03%
-
pos192_5/12 270735061 566305900680 0.05%
-
pos192_5/11 0 835172285111 0.00%
-
pos192_5/10 129708863 422783963455 0.03%
-
pos192_5/9 0 808295923141 0.00%
-
pos192_4/12 0 813428777843 0.00%
-
pos192_4/11 93424461 458341514305 0.02%
-
pos192_4/10 0 0 0.00%
-
pos192_4/9 0 0 0.00%
-
pos192_3/10 0 698106360004 0.00%
-
pos192_3/9 32986094 361399485011 0.01%
-
pos192_2/9 0 716388812751 0.00%
-
pos192_1/10 0 821077292172 0.00%
-
pos192_1/9 1065993977 1235032965369 0.09%
-
pos192_2/10 713658786 1560654454583 0.05%
-
2 pos192_6/12 0 838241480577 0.00%
-
pos192_6/10 0 829312701821 0.00%
-
--More—
这种情况下,输出信息是不完整的,所以需要模拟敲空格的过程。但是我应该模拟敲多少次空格呢???先看代码。
-
import sys
-
import time
-
import telnetlib
-
-
user = sys.argv[1]
-
passwd = sys.argv[2]
-
ip = sys.argv[3]
-
cmd = sys.argv[4]
-
-
tn = telnetlib.Telnet(ip)
-
tn.read_until('Username:')
-
tn.write(user + "n")
-
tn.read_until('Password:')
-
tn.write(passwd + "n")
-
tn.read_until('>')
-
tn.write("enn")
-
tn.read_until("Password:")
-
tn.write(passwd + "n")
-
tn.read_until('#')
-
-
tn.write(cmd + "n")
-
while True:
-
ret = tn.read_until('#', 1)
-
print ret
-
if '#' in ret:
-
break
-
else:
-
for i in range(10):
-
tn.write(' ')
-
time.sleep(0.1)
-
-
tn.close()
我这里的处理方法是使用read_until方法,每次判断返回的信息是否包含命令行提示符“#”,如果不包含,说明信息还没输出完整,“敲一个空格”;如果包含,则说明信息已经输出完整。read_until是阻塞式的,所以这里加了个超时值。经测试,在输出比较多时,一次输入10个空格可以提高效率。
另外一个问题是,返回的信息里是含有more以及^H、^M这些额外的字符的,可以借助col和grep命令等自行处理一下,所以最终的使用方法是:
-
$python telnet.py winway 123456 192.168.101.37 'show security acl-group hits global' | col -b
这样我们就获得了所需要的信息了,接下来就是针对信息进行文本处理了。
如果针对这个需求,哪位有更elegant的解决方法,还望不吝赐教^_^
阅读(10210) | 评论(1) | 转发(0) |