2014-10-13 5 views
0

Требуется ли pexpect.spawn время для вызова сценария Python?Python pexpect - spawn занимает время, чтобы установить

Я пишу сценарий для управления контейнером Karaf, используя команду pexpect для ввода команд. Если Karaf не работает, я заметил, что я не всегда могу надежно использовать isalive(), если я не вставлю паузу в скрипт.

Например: -

# open a Karaf SSH session 
karaf_session = pexpect.spawn("ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p " + 
         karaf_port + " " + 
         karaf_id + "@" + 
         karaf_host) 

log_file = open(log_file_name, "wb") 
karaf_session.logfile_read = log_file 

time.sleep(1) 

if karaf_session.isalive(): 
    print("Connected to Karaf") 
else: 
    print("Failed to connect to Karaf") 

Если я закомментировать time.sleep(1) тогда isalive() возвращается правда, даже если Karaf не работает.

В зависимости от того, logfile_read до или после сна, он либо не ловит ничего или следующее: -

ssh: connect to host localhost port 8101: Connection refused 

Я предпочел бы иметь что-то более надежное, чем произвольный сон!

ответ

3

Ну, независимо от состояния соединения, процесс ssh будет работать в течение некоторого периода времени, в течение которого isalive() будет (правильно) возвращать True - в конце концов, он работает. Однако работающий ssh ​​не означает, что было установлено успешное соединение, потому что для этого требуется определенное количество времени.

Добавление сна обеспечивает достаточное время для прекращения процесса ssh, вызванного неудачным соединением, когда Karaf не работает. Без задержки isalive() оценивается, пока ssh все еще работает и, следовательно, возвращает True.

Итак, вы не можете полагаться на то, что процесс ssh работает, чтобы иметь в виду, что у вас есть действующее соединение с вашим сервером Karaf. Вы должны взаимодействовать с ним, ожидая, чтобы увидеть, является ли Password: приглашение выдано Karaf, например:

import time 
import getpass 
import pexpect 

karaf_port = 8101 
karaf_id = 'user' 
karaf_host = 'localhost' 
log_file_name = 'karaf.log' 

ssh_command = 'ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p {} {}@{}'.format(karaf_port, karaf_id, karaf_host) 

karaf_session = pexpect.spawn(ssh_command) 

log_file = open(log_file_name, "wb") 
karaf_session.logfile_read = log_file 

try: 
    karaf_session.expect('Password:', timeout=5) 
    print('Got "Password:" prompt, sending password') 
    karaf_session.sendline(getpass.getpass("Enter your Karaf password: ")) 
    # etc., etc. 
except pexpect.EOF as e: 
    print('Connection failed. Got EOF exception waiting for "Password:" prompt') 
except pexpect.TIMEOUT as e: 
    print('Timed out waiting for "Password:" prompt') 
+0

Спасибо - что имеет смысл. Основная проблема заключалась в том, что мне нужна явная инструкция catch ('except pexpect.EOF') как часть моей проверки пароля. У меня был только общий 'кроме pexpect, как e'. –

 Смежные вопросы

  • Нет связанных вопросов^_^