1. 程式人生 > >[python]使用gevent實現並行登入路由器

[python]使用gevent實現並行登入路由器

python內建了telnetlib模組,這點比perl強不少。

更好的是,利用gevent的猴子補丁,可以很容易地實現基於協程的並行登入。

#!/bin/env python
#encoding=utf-8  
import gevent
from gevent import monkey
monkey.patch_all()
 
#建立函式  
def do_telnet(Host, username, password, finish, commands):  
    import telnetlib  
    '''''Telnet遠端登入:Windows客戶端連線Linux伺服器'''  
   
    # 連線Telnet伺服器  
    try:
        tn = telnetlib.Telnet(Host, port=23, timeout=10)  
    except:
        print "%s login fail" % (Host)
        return
    #tn.set_debuglevel(2)  
       
    # 輸入登入使用者名稱  
    tn.read_until('sername: ')  
    tn.write(username + '\n')  
      
    # 輸入登入密碼  
    tn.read_until('assword: ')  
    tn.write(password + '\n')  
        
    # 登入完畢後執行命令  
    ret=tn.read_until(finish)  
    print "%s login ok %s" % (Host,ret)
    for command in commands:  
        tn.write('%s\n' % command)  
      
    #執行完畢後,終止Telnet連線(或輸入exit退出)  
    ret=tn.read_until(finish,5)
    print ret
    tn.close() # tn.write('exit\n')  


if __name__=='__main__':       
    # 配置選項  
    Host=['192.168.6.87','192.168.6.26','192.168.6.87'] # Telnet伺服器IP  
    username = 'aaa'   # 登入使用者名稱  
    password = 'aaa'  # 登入密碼  
    prompt = '#'      # 命令提示符  
    commands = [['ping 192.168.6.26'],['ping 192.168.6.45'],['ping 192.168.6.150']]            
    
    #do_telnet(Host[0], username, password, prompt, commands[0])  
    
    #建立協程      
    nodes = []    
    for i in xrange(0,3):    
         nodes.append(gevent.spawn(do_telnet, Host[i], username, password, prompt, commands[i]))    
    #開始執行    
    gevent.joinall(nodes)
 
很多比較老的裝置,路由器交換機仍然只支援telnet,用這種方式可以方便地登入。

不過很多比較新的裝置和主機,都只支援ssh登入了,又如何處理呢?

 很遺憾啊,paramiko+gevent monkey是不行的。

 這個咱們以後再說。