2017-05-23 2 views
0

J'ai du mal à écrire un script Python qui peut se connecter à nos routeurs Cisco et collecter la sortie de commandes simples. Le défi est que tous les routeurs ne sont pas configurés de la même manière. Lorsque vous effectuez un telnet pour certains d'entre eux, vous devez entrer un mot de passe &; les autres routeurs vous mettent au défi pour le mot de passe uniquement. Mon script doit être assez intelligent pour faire la différence.Python Script Telnets à Cisco Router ... puis blocs?

J'ai écrit le code ci-dessous, qui est assez intelligent pour réaliser si le routeur attend un nom d'utilisateur ou non. Le problème est, il semble bloquer après avec succès la connexion. (Cela fonctionne pour les noms d'utilisateur/mot de passe et mot de passe seulement des routeurs.) J'ai passé la journée à lutter avec ce code, et je pense que le code bloque quand j'essaye lire après avoir envoyé ma commande Cisco simple. (Mais c'est aussi possible que le "show ip int bref" commmand n'est pas envoyé.)

Voici le code:

#!/usr/bin/python 

import telnetlib 
import sys 


def telnetLogin(host): 
    username = "userguy"      # Correct username 
    password = "password1"     # Correct password 

    flag = 1 
    tn = telnetlib.Telnet(host) 
    while(flag): 
    output = tn.read_some()    # get one line 
    if("username:" in output.lower()):  # We are prompted for "Username:" 
     tn.write(username+"\n") 
    elif("password:" in output.lower()): # We are prompted for "Password:" 
     tn.write(password+"\n") 
     flag = 0 

    print("======================================================") # Code reaches here 

    tn.write("show ip int brief"+"\n")  # Issue simple Cisco cmd here 
    output = tn.read_all()     # I am blocking here??? 
    #output = tn.read_until(">", 2)   # This doesn't work either 
    print "output :: "+output    # I never reach this line 
    tn.close() 

def main(): 
    host = sys.argv[1] 
    output=telnetLogin(host) 

if __name__ == "__main__": 
    main() 
    print("Program done!\n") 

Voici la sortie:

[Linux]$ ./telnetToRouter.py RouterA 
====================================================== 
...program blocks here... 

Je ne peux pas comprendre pourquoi je serais capable de lire/écrire avec succès pour me connecter, mais je ne pourrais pas lire/écrire après cela. Comment dépannez-vous quelque chose comme ça?

Merci, -RAO

Répondre

0

je suis tombé sur la réponse en regardant mes journaux du routeur. Il s'avère que le problème ici était une chose de Cisco, pas une chose de Python. Pour expliquer:

Quand un telnets admin humain à un routeur Cisco et émet une commande avec une longue sortie, le routeur se briseront la sortie comme ceci:

Router-A# 
Router-A# show ip int brief 
Interface    IP-Address  OK? Method Status    Protocol 
GigabitEthernet0/0  10.10.10.100 YES NVRAM up     up 
GigabitEthernet0/1  10.10.20.100 YES NVRAM up     up 
GigabitEthernet0/2  10.10.30.100 YES NVRAM up     up 
GigabitEthernet0/3  10.10.40.100 YES NVRAM up     up 
--More-- 

Ce « --More-- » est un signal pour l'administrateur humain pour frapper la barre d'espace pour plus de sortie. Donc, en réalité, mon script Python ne bloquait pas - il était suspendu parce qu'il ne comprenait pas la syntaxe "more".

La solution est d'avoir la question de script une commande « term len 0 » immédiatement après la connexion au routeur. Cette commande est Ciscoese pour "imprimer toutes les sorties dans un gros bloc" Une fois que mon script a fait cela, il était capable d'interagir avec le routeur, pas de problème.