Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156459
  • 博文数量: 13
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 871
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-02 10:59
个人简介

Nobody.

文章分类

全部博文(13)

文章存档

2013年(13)

分类: 系统运维

2013-05-22 16:00:43

需求:自动登录到交换机或路由器,抓取acl规则命中统计信息。

Python可以使用telnetlib来方便的完成与网络设备的telnet交互,先看个简单的demo


  1. import sys
  2. import telnetlib

  3. HOST = "localhost"
  4. user = raw_input("Enter your remote account: ")
  5. password = raw_input("Enter your password: ")

  6. tn = telnetlib.Telnet(HOST)

  7. tn.read_until("login: ")
  8. tn.write(user + "n")
  9. if password:
  10.     tn.read_until("Password: ")
  11.     tn.write(password + "n")

  12. tn.write("lsn")
  13. tn.write("exitn")

  14. print tn.read_all()

这样就可以获取远程设备上的信息了,很简单。不过这里可能有个问题,就是当输出信息比较多时,如:


  1. #show security acl-group hits global
  2. Rule Interface Hits Total Percentage
  3. -------------------------------------------------------------------------
  4. 1 pos192_6/12 0 838241480577 0.00%
  5. pos192_6/11 155468324 604476632172 0.03%
  6. pos192_6/10 0 829312701821 0.00%
  7. pos192_6/9 145907985 559951471369 0.03%
  8. pos192_5/12 270735061 566305900680 0.05%
  9. pos192_5/11 0 835172285111 0.00%
  10. pos192_5/10 129708863 422783963455 0.03%
  11. pos192_5/9 0 808295923141 0.00%
  12. pos192_4/12 0 813428777843 0.00%
  13. pos192_4/11 93424461 458341514305 0.02%
  14. pos192_4/10 0 0 0.00%
  15. pos192_4/9 0 0 0.00%
  16. pos192_3/10 0 698106360004 0.00%
  17. pos192_3/9 32986094 361399485011 0.01%
  18. pos192_2/9 0 716388812751 0.00%
  19. pos192_1/10 0 821077292172 0.00%
  20. pos192_1/9 1065993977 1235032965369 0.09%
  21. pos192_2/10 713658786 1560654454583 0.05%
  22. 2 pos192_6/12 0 838241480577 0.00%
  23. pos192_6/10 0 829312701821 0.00%
  24. --More—

这种情况下,输出信息是不完整的,所以需要模拟敲空格的过程。但是我应该模拟敲多少次空格呢???先看代码。


  1. import sys
  2. import time
  3. import telnetlib

  4. user = sys.argv[1]
  5. passwd = sys.argv[2]
  6. ip = sys.argv[3]
  7. cmd = sys.argv[4]

  8. tn = telnetlib.Telnet(ip)
  9. tn.read_until('Username:')
  10. tn.write(user + "n")
  11. tn.read_until('Password:')
  12. tn.write(passwd + "n")
  13. tn.read_until('>')
  14. tn.write("enn")
  15. tn.read_until("Password:")
  16. tn.write(passwd + "n")
  17. tn.read_until('#')

  18. tn.write(cmd + "n")
  19. while True:
  20.     ret = tn.read_until('#', 1)
  21.     print ret
  22.     if '#' in ret:
  23.         break
  24.     else:
  25.         for i in range(10):
  26.             tn.write(' ')
  27.             time.sleep(0.1)

  28. tn.close()

我这里的处理方法是使用read_until方法,每次判断返回的信息是否包含命令行提示符“#”,如果不包含,说明信息还没输出完整,“敲一个空格”;如果包含,则说明信息已经输出完整。read_until是阻塞式的,所以这里加了个超时值。经测试,在输出比较多时,一次输入10个空格可以提高效率。

另外一个问题是,返回的信息里是含有more以及^H^M这些额外的字符的,可以借助colgrep命令等自行处理一下,所以最终的使用方法是:


  1. $python telnet.py winway 123456 192.168.101.37 'show security acl-group hits global' | col -b

这样我们就获得了所需要的信息了,接下来就是针对信息进行文本处理了。

如果针对这个需求,哪位有更elegant的解决方法,还望不吝赐教^_^


阅读(10210) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

superkey0072013-12-14 21:45:34

我在写一个zte设备类似功能,文件内容过多时后面就是显示不了用\n 始终不行纠结了一天多,最终还是在这找到解决方法,多谢阿!