0

コマンドのリストを入力として受け取り、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 の実装によるものですか? コマンドプロンプトテキストを受け取る方法はありますか?

4

2 に答える 2

0

IEEE 標準 1003.1PS1の (出力するプロンプトを指定する変数)のエントリを参照してください(強調を追加):

PS1

対話型シェルがコマンドを読み取る準備ができるたびに、この変数の値はパラメーター展開の対象となり、標準エラーに書き込まれます。デフォルト値は「$」です。特定の追加の実装定義の権限を持つユーザーの場合、デフォルトは別の実装定義の値になる場合があります。シェルは、文字「!」の各インスタンスを置き換えます。PS1 では、次に入力するコマンドの履歴ファイル番号を使用します。「!」のエスケープ 他のと '!' (つまり、"!!" ) は、リテラル文字 '!' を配置します。プロンプトで。POSIX.1-2008 のこのボリュームでは、ユーザー ポータビリティ ユーティリティ オプションをサポートするシステムに対してのみ変数の効果を指定します。

したがって、POSIX 準拠のシェル (busybox ash だけでなく、ksh、dash、bash、その他すべて) は、プロンプトをstderrではなくに書き込む必要がありますstdout


したがって、簡単な修正は、 から読み取るか、stderrリダイレクトを使用してストリームを結合することです (exec 2>&1たとえば、 を実行しています)。

于 2014-12-09T18:35:45.343 に答える