Ожидайте, не дожидаясь всего вывода - Ubuntu

У меня есть простой скрипт для подключения SSH к сетевому коммутатору, выполнения команд и сохранения вывода в файл. Он отлично работает для вывода, который отображается мгновенно, но когда я запускаю «show iproute», он не фиксирует вывод. Причина в том, что когда я запускаю ту же команду на коммутаторе напрямую, она думает 5-6 секунд, показывает кучу строк и снова думает, показывает еще пару строк и затем заканчивается. Это не ожидание должным образом выполнения всей команды, что у меня проблема с исправлением:

str_prompt = ' # '
command = "sh iproute"
device_name = "switch1.test.com"

# Spawn SSH session
ssh_command = 'ssh {}@{}'.format(username, device_name)
session = pexpect.spawn(ssh_command, timeout=5)

# Send the password
session.sendline(password)

# Expect the switch prompt (successful login)
expect_index = session.expect([pexpect.TIMEOUT, str_prompt])
# Success
if expect_index == 1:
    # Disable clipaging so that all the output is shown (not in pages) | same as term len 0 in Cisco
    session.sendline('disable clip')
    # Expect the switch prompt if command is successful
    expect_index = session.expect([pexpect.TIMEOUT, str_prompt])

    # Send show iproute command
    session.sendline(command)
    # < This is where it needs to wait >
    #session.expect(pexpect.EOF) - Tried this and wait() but that broke the scipt
    #session.wait()
    # Expect the switch prompt if command is successful
    session.expect(str_prompt)

    # Save output of "sh iproute" to a variable
    output = session.before
    # Save results to a file
    fp = open(host + '-route.txt', "w")
    fp.write(output)
    fp.close()

Вот пример вывода. В выходных данных есть «#», но не «#».

#oa  10.10.10.0/24      10.0.0.1    4    UG-D---um--f- V-BB1 99d:0h:14m:49s
#oa  10.10.20.0/24      10.0.0.1    4    UG-D---um--f- V-BB2 99d:0h:14m:49s
#oa  10.10.30.0/24      10.0.0.1    4    UG-D---um--f- V-BB3 99d:0h:14m:49s
#oa  10.10.40.0/24      10.0.0.1    4    UG-D---um--f- V-BB4 99d:0h:14m:49s
and many more line ....

Любая помощь будет оценена. Спасибо

Редактировать: я добавил sleep(60), и это, похоже, помогло, но я не хочу его использовать, так как отправляю несколько команд, и некоторые из них очень быстрые. Я не хочу ждать 1 минуту для каждой команды, скрипт будет работать вечно.


person Neo    schedule 05.01.2018    source источник
comment
Натыкаюсь на свои вопросы....   -  person Neo    schedule 09.01.2018


Ответы (1)


Поэтому вам нужно связать тайм-аут с командами. Сегодня я делаю это так: у меня есть формат файла xml, который анализирует мой код, тег xml будет иметь атрибут для команды и еще один для тайм-аута, еще один для end_prompt команды и так далее.

Мой код считывает команду и ее тайм-аут и соответственно устанавливает соответствующие переменные перед отправкой команды.

session.sendline(command) #command is read from a xml file
session.expect(end_prompt, timeout=int(tmout)) # end_prompt, tmout for the command read form the same file

В вашем случае, если вы не хотите анализировать файл, чтобы получить команду и связанные с ней параметры, вы можете использовать их как словарь в своем скрипте и использовать его.

command_details_dict = { "cmd_details" :[
                                         {'cmd': 'pwd',
                                          'timeout': 5,
                                          },
                                         {'cmd': 'iproute',
                                          'timeout': 60,
                                          }
                                         ]
                       } 

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

Но если у вас есть время, я бы предложил вместо этого использовать файл конфигурации.

person satyakrish    schedule 26.01.2018
comment
Спасибо за ваш отзыв! - person Neo; 30.01.2018
comment
Это нормально, но в большинстве случаев вам не нужно связывать разные тайм-ауты с разными командами. Вы можете просто установить тайм-аут для самой медленной команды. В отличие от добавления сна, тайм-аут вступает в силу только в том случае, если вы не видите командную строку в выходных данных. Если у вас более длительный тайм-аут, но командная строка отображается очень быстро, сценарий продолжает работу, и тайм-аут не оказывает никакого влияния. - person Dan J.; 27.08.2018