0

pexpect.spawn は、呼び出し元の Python スクリプトに戻るのに時間がかかりますか?

pexpect を使用してコマンドを挿入し、Karaf コンテナーを管理するスクリプトを作成しています。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 が実行されていなくても true が返されます。

がスリープの前か後かに応じて、logfile_read何もキャッチしないか、次のいずれかをキャッチします。

ssh: connect to host localhost port 8101: Connection refused

恣意的なスリープよりも信頼性の高いものが欲しいです。

4

1 に答える 1

3

接続ステータスに関係なく、sshプロセスは一定期間実行されます。その間、isalive()(正しく) True が返されます。つまり、プロセスは実行されています。ただし、実行中の ssh は、成功した接続が確立されたことを意味するものではありません。これは、接続が確立されるまでにある程度の時間がかかるためです。

スリープを追加すると、Karaf が実行されていないときに接続が失敗したために、生成された ssh プロセスが終了するのに十分な時間が提供されます。遅延がなければ、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 に答える