Python 抓取 H3C AC 控制器中 AP 设备的状态信息

因为工作上的需求,帮同事编写了一个 Python 脚本用于抓取取 H3C AC 控制器中 AP 设备的状态信息,使用了 Python 自带的 telnetlib 库。主要遇到的问题是命令返回的信息不是一次加载完成,需要一定交互 More 后显示,这里用到了 telnetlib 库中的 expect 函数,对返回值做正则匹配,具体可查看 telnetlib 文档 https://docs.python.org/2/library/telnetlib.html

以下为脚本代码:

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
71
72
73
74
import telnetlib,time

def do_telnet(Host, username, password):

# 连接Telnet服务器
tn = telnetlib.Telnet(Host, port=23, timeout=10)
tn.set_debuglevel(0)
#tn.set_debuglevel(2)
# 配置debug级别,调试程序时可以设置为2

# 输入登录用户名
tn.read_until('login: ')
tn.write(username + '\n')

# 输入登录密码
tn.read_until('Password: ')
tn.write(password + '\n')

# 登录完毕后切换到系统视图
tn.read_until('<H3C>')
tn.write('sy\n')

#执行命令
tn.read_until('[H3C]')
tn.write('display wlan ap all address\n')
time.sleep(1)
a = []
a.append('More')
#print a
result = str()
b,c,d = tn.expect(a,timeout=1)
result += d
#print b
while b == 0:
tn.write(' ')
b,c,d = tn.expect(a,timeout=1)
#print b # 有More为0,无More为-1
result += d
if -1 == b:
#退出视图模式
tn.write('exit\n')
tn.read_until('<H3C>')
tn.write('exit\n')
break
print 'get result success!'

#print result #获取到带More的所有返回结果
str_list = result.split('\r\n')
status = str_list[:7]
status = map(lambda x:x.replace('\r',''), status)
str_list = str_list[8:]
str_list = str_list[:-2]
#f=file(r'./out','a')
result_list = []
for i in str_list:
#替换删除含有More的行
i = i.replace('---- More ----\r\r \r','')
i = i.replace('\r','')
#f.write(i)
#print i.strip()
result_list.append(i)
#f.close
#注释了部分用于写入到文本的代码
result_list = map(lambda x: x.split(), result_list)
return result_list,status

if __name__=='__main__':
# 配置选项
Host = 'ip' # Telnet服务器IP
username = 'user'
password = 'password'
result_list,status = do_telnet(Host, username, password)
print status
print result_list