Python - телнет на роутерах и вывод полного списка (нажатие пробела) - PullRequest
1 голос
/ 11 сентября 2010
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() 

Моя проблема в том, что когда я пытаюсь получить «show log» от маршрутизатора cisco, это дает мне только частичный результат, я думаю, это потому, что вам нужно нажать пробел 5 раз (зависит от того, какова длительность журнала) полный журнал, когда я делаю это вручную, и я не знаю, как сказать python перечислить полный журнал. Любое предложение?

Ответы [ 3 ]

5 голосов
/ 11 сентября 2010

Не решение, но кажется приемлемым обходным путем:

Вы можете отключить подкачку терминала, введя следующую команду IOS CLI.

длина терминала 0

4 голосов
/ 08 февраля 2011

Это на самом деле точный ответ ..... вам нужно ввести длину терминала 0 или маршрутизатор перенаправляет вывод, как при использовании unix "more", чтобы он был удобочитаемым и не просто прокручивал до быстрого

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 голосов
/ 27 ноября 2012

Тогда возникает проблема, как перехватить вывод размером больше, чем около 20 КБ ... при входе в файл я получаю все выходные данные, но я хочу сохранить только выборочный вывод, а не весь сеанс. При использовании child.after выходные данные обрезаются, например, отсутствует начало, которое можно немного смягчить, увеличив максимальный размер, но оно все равно разлетается при достижении 30-40 КБ выходных данных.

Для тех, кто интересуется, я собираю выходные данные коммутаторов Cisco с помощью «sh int | i protocol | Last», это возвращает только 3 строки на интерфейс, но некоторые из стеков коммутаторов моего клиента имеют 450 портов.

Не уверен, что динамика здесь, но для некоторых переключателей это удается.

Некоторое время я пытался обойти эту проблему, выборочно включая и отключая ведение журнала в файл. Это оказалось ненадежным, и из общего ведения журнала я вижу, что pexpect сопоставляет выходной путь до того, как ведение журнала его увидит. Я закончил тем, что отключил регистрацию, в то время как данные все еще записывались в файл. усечение вывода после примерно 10 строк вывода.

Таким образом, остается главный вопрос: как повысить надежность ребенка? Для того, чтобы захватить большие выходы. У меня нет проблем с увеличением времени ожидания ожидаемых заявлений, если выходные данные надежны. То, что я вижу сейчас, - это не тайм-аут с неполным выводом.

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
...