2010-09-11 7 views
0
import telnetlib 

def telNetCall(): 
    host = "10.200.1.23" 
    user = "me" 
    password = "matrix" 
    telnet = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r') 
    telnet.read_until('Password: ', 3) 
    telnet.write(password + '\r') 
    telnet.write("sh log"+ "\r\n") 
    telnet.write('exit' + '\r') 
    print telnet.read_all() 

Mon problème est que lorsque j'essaie de saisir "show log" de routeur Cisco, il me donne juste résultat partiel, je pense que c'est parce que vous besoin d'appuyer sur la barre d'espace 5 fois (dépend de la durée de l'historique du journal) pour obtenir le journal complet - quand je le fais manuellement, et je ne sais pas comment dire à Python de lister le journal complet. Toute suggestion?Python - telnet sur les routeurs et liste résultat complet (barre d'espace de frappe)

+0

Envoyer speacebars? – Robus

+0

Que voulez-vous dire? Exemple? – Whit3H0rse

Répondre

5

Pas une solution, mais une solution semble plausible:

Vous pouvez désactiver la pagination de terminal en exécutant la commande suivante IOS CLI.

longueur terminale 0

+0

Eh bien c'est une bonne solution de contournement :) Tx – Whit3H0rse

3

Il est en fait la réponse exacte ..... vous devez entrer la longueur du terminal 0 ou les pages routeur la sortie en utilisant comme unix « plus » pour qu'il soit lisible par l'homme et ne défile pas seulement par rapidement

import telnetlib 

def telNetCall(): 
    host = "10.200.1.23" 
    user = "me" 
    password = "matrix" 
    telnet = telnetlib.Telnet(host) 
    telnet.read_until('Username: ', 3) 
    telnet.write(user + '\r') 
    telnet.read_until('Password: ', 3) 
    telnet.write(password + '\r') 

    telnet.write("term length 0"+ "\r\n") 

    telnet.write("sh log"+ "\r\n") 
    telnet.write('exit' + '\r') 
    print telnet.read_all() 
3

le problème devient alors comment capturer la sortie supérieure à environ 20 Ko ... lors de la connexion à déposer, je reçois toute la sortie, mais je veux seulement sauver la sortie sélective, non toute la session Lors de l'utilisation de child.after la sortie est tronquée, par exemple le début est manquant ce qui peut être atténué un peu en augmentant maxread mais il bombarde quand même en obtenant près de 30-40kb de sortie. Pour ceux qui se demandent, je saisis la sortie des commutateurs Cisco en utilisant "sh int | i protocol | Last" cela ne renvoie que 3 lignes par interface mais certaines des commutateurs de mon client ont 450 ports.

Vous ne savez pas quelle est la dynamique ici, mais pour certains commutateurs, elle réussit. Pendant un certain temps, j'ai essayé de contourner le problème en activant et désactivant de manière sélective la journalisation. Cela s'est avéré peu fiable et de la journalisation générique, je peux voir que pexpect correspond à la sortie avant que la journalisation ne le voit. J'ai fini par désactiver la journalisation alors que les données étaient encore en cours d'écriture dans le fichier. tronquer la sortie après environ 10 lignes de sortie.

Donc, la question ultime demeure, comment peut-on augmenter la fiabilité de child.after. Afin de capturer de grandes sorties. Je n'ai aucun problème avec l'augmentation du délai d'attente sur les instructions expect, tant que la sortie est fiable. Ce que je vois maintenant, ce n'est pas un timeout avec une sortie incomplète.

child.sendline(action) 
child.expect(prompt_keys) 
action_output = str(child.after) # Captures the output 
# print action_output # Uncomment for debugging grabbed output 
output_file.write(action_output + "\n\n\n") # Write the output to file