Python telnetlib определяет различные приглашения для входа в систему

Я написал скрипт на Python, который может последовательно входить на несколько устройств, читая CSV-файл, в котором перечислены разные IP-адреса. Оттуда он выводит файл для каждого устройства с содержимым нескольких команд, которые передаются на устройства через скрипт. Так что я зашел довольно далеко. Проблема, с которой я сталкиваюсь, заключается в том, что иногда скрипт зависает. И это потому, что некоторые устройства имеют разные версии программного обеспечения и не поддерживают определенные команды, которые им передаются. Отличие, на которое я обращаю внимание, — это приглашение после входа в систему. Например, при входе в устройство типа A есть командная строка xyz#. Устройство типа B имеет тип команды abc:. Это тот же производитель, просто другая модель и/или версия программного обеспечения. В зависимости от командной строки я знаю, какие команды я могу запустить на этом устройстве без зависания сценария. Итак, что мне нужно сделать, так это после успешного входа в систему, в зависимости от командной строки, которую я получаю, запуская набор определенных команд.

Я могу опубликовать часть своего кода, если это поможет, но я действительно хочу выяснить, возможно ли это вообще. А раз так, то указатели. Несколько предложений о том, что я мог бы попробовать. После работы с Python в течение нескольких месяцев я знаю, что должен быть способ сделать это. Обычно я не публикую, потому что могу проработать чужие посты и разработать работающее решение. Но я немного поработал над этим и не смог собрать его воедино, поэтому ищу помощи.

-Шейн

РЕДАКТИРОВАТЬ

На данный момент я все еще не могу написать код, который определил бы командную строку. Ну, по крайней мере, пока сессия телнета открыта. Я могу подключиться по телнету, запустить несколько команд и закрыть сеанс. Затем я могу записать результаты в файл. И оттуда прочитайте файл, чтобы определить подсказку. Но в идеале я хотел бы иметь возможность открывать сеанс telnet, запускать команду для определения приглашения, пока сеанс еще открыт, читать его, пока сеанс запущен, а затем на основе приглашения запускать определенные команды.

Проблема, похоже, заключается в невозможности прочитать какой-либо вывод команды, пока сеанс telnet все еще работает. Сеанс должен быть закрыт, а затем записан весь вывод в файл. Затем прочитайте файл, чтобы определить командную строку, определите, какие команды выполнять на основе приглашения, затем откройте новый сеанс telnet и выполните эти команды.

Должен ли я принять тот факт, что мне нужно закрыть сеанс telnet, записать данные в файл, прочитать его, чтобы определить приглашение, а затем снова вернуться к части сценария входа в систему? Или я что-то упускаю? Не уверен, что ясно выразился в своем описании.


person 2ndg33r    schedule 19.04.2012    source источник


Ответы (1)


Я бы реализовал команды, используя общий интерфейс, а затем использовал бы словарь для их извлечения, когда я знаю, к какой системе я подключен:

# command set for system xyz#
def copy1(src, dest):
  pass

def list1():
  pass

# command set for system abc:
def copy2(src, dest):
  pass

def list2():
  pass


cmdDict = {
   # prompt  command set
   'xyz#':   [copy1, list1],
   'abc:'    [copy2, list2],
}

...

# guess the right commands from the prompt we have read
copyCommand = cmdDict[detected_prompt][0]
listCommand = cmdDict[detected_prompt][1]

...

# proceed normally

listCommand()
copyCommand(f1, g1)
copyCommand(f2, g2)
person deStrangis    schedule 19.04.2012
comment
Спасибо за ваш ответ. Я попытаюсь включить это в свой сценарий и вернусь с результатами. - person 2ndg33r; 20.04.2012