コマンドのリストを入力として受け取り、Telnet または SSH セッションを介してリストを実行する Python GUI を作成しました。(Python で Paramiko を使用して) SSH セッションを開いているときに、for ループで次のコードを使用して、さまざまなデバイスでコマンドを実行します。
stdin.write(command+"\n")
then = time.time()
timeout=10.0
while not stdout.channel.exit_status_ready():
if timeout is not None:
timeTest =time.time() - then
if timeout <= timeTest:
break
# Only print data if there is data to read in the channel
if stdout.channel.recv_ready():
# Write data from stdout
temp=str(stdout.channel.recv(1024))
print temp
if (temp.endswith(delim)) or (temp.endswith("# ")) :
print "successful exit"
break
このコードは、BusyBox がインストールされているモデムで使用するように設計されています。したがって、ユーザーがコマンドを入力して busybox を開き、BusyBox シェルで一連のコマンドを実行するのは一般的です。このコード行 "if (temp.endswith(delim)) または (temp.endswith("# "))" でわかるように、while ループは、busybox のコマンド プロンプトが検出されたときにブレークすることになっています。 # " (これは、コマンドが出力を終了したことを意味します)。
私が抱えている問題は、BusyBox がコマンド プロンプトを stdout またはデバッグ ラインの「print temp」に出力しないことです。どうしてこれなの?コマンド出力 (例は ls -l) は正常に stdout に出力されますが、コマンド プロンプトや busybox の導入メッセージには出力されません: ユーザーがこれらのモデムで busybox に入ると、導入メッセージが出力されます "BusyBox v1.17.2 (2014-10-02 10:50:35 PDT) 組み込みシェル (ash) 組み込みコマンドのリストについては、「help」と入力してください。これもSTDOUTに出力されません。これは、busybox で実行される各コマンドのタイムアウトをコードに強制的に使用させますが、これは望ましくありません。つまり、処理が遅く、必要なタイムアウトよりも長い時間がかかるコマンド出力が存在する可能性があるため、コマンド プロンプトを探すのが最善です。
この問題は、BusyBox での ash の実装によるものですか? コマンドプロンプトテキストを受け取る方法はありますか?