0

pexpect.spawn 是否需要时间才能返回其调用 Python 脚本?

我正在编写一个脚本来管理一个 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()返回 true,即使 Karaf 没有运行。

根据logfile_read是在睡眠之前还是之后,它要么什么都没有捕获,要么捕获以下内容:-

ssh: connect to host localhost port 8101: Connection refused

我宁愿拥有比任意睡眠更可靠的东西!

4

1 回答 1

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')
于 2014-10-13T11:34:06.863 回答