python te lnet не нажимая ввод с "\ n" - PullRequest
0 голосов
/ 23 апреля 2020

Я работаю над сценарием для извлечения настроек из устройств Cisco в GNS3. В настоящее время он использует жестко запрограммированный IP-адрес и порт из-за другой отдельной проблемы, но это код, который я сейчас использую.

import getpass
import telnetlib

print "Getting running-config 127.0.0.1:5002"
tn = telnetlib.Telnet("127.0.0.1","5002")

tn.write("terminal length 0\n")
tn.write("show run\n")
tn.write("exit\n")

readoutput = tn.read_until("exit")
saveoutput = open("C:\Programdata\switch.txt","w")
saveoutput.write(readoutput)
saveoutput.write("\n")
saveoutput.close
print tn.read_all()

Если я закомментирую блоки кода readouput и saveoutput, Скрипт проходит так быстро, как я ожидал. Однако, когда я оставляю этот код там, он просто сидит и зависает. Я поместил команды print () для проверки, и он зависает в строке считывания. Я пробовал оба tn.read_all & tn.read_until (без и без строкового параметра), и ни один из них не работает.

Несмотря на то, что выходные данные не работают, я знаю, что что-то происходит, потому что, если я lnet в переключитесь с помощью telnet 127.0.0.1 5002 в командной строке, он появится без проблем, а также сможет проходить через мои терминальные команды.

Редактировать: Сегодня я провел больше испытаний с этим и выяснил, используя много таймеров сна и распечатывая в терминале, что происходит. Как выяснилось, по какой-то причине сеанс te lnet на самом деле не нажимает ввод, когда это необходимо. Я попытался изменить tn.write("text\n") на tn.write("text" + "\n") и даже разбить его на две команды записи, но ни одна из них не работает. Ниже сеанс te lnet, который я открыл после нескольких неудачных попыток заставить скрипт работать. Заметьте, все команды просто стоят в очереди? Если я изменю вывод вывода на «xit», который представляет собой текст в первой строке консоли ios, он найдет его в te lnet и напечатает все в сеансе te lnet до этой точки.

Если кто-нибудь знает, почему "\n" на самом деле не нажимает Enter, я был бы очень признателен за помощь, поскольку это должно стать моим последним серьезным препятствием на пути создания программы, этот скрипт является частью работы.

strong text

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Причина такого поведения заключается в том, что \n на самом деле не возврат каретки (CR) - это перевод строки (LF) в строку, и разные системы могут иметь различную реализацию EOL (наиболее очевидный пример - Linux ' с \n против Windows х \r\n). В случае Cisco IOS кажется, что достаточно \r, хотя в настоящее время я не могу его проверить.

Попробуйте добавить \r\n, поскольку это значение по умолчанию Te lnet поведение согласно spe c, которое должно работать.

0 голосов
/ 28 апреля 2020

Весь ваш код имеет значение True, а также оба:

tn.write ("text \ n")

tn.write ("text" + "\ n")

Это правда. Просто отсутствует один b :

Ваш код должен быть таким:

tn.write(b"en" + b"\n")
tn.write(b"terminal length 0\n")
tn.write(b"show run\n")
tn.write(b"exit\n")
...