問題タブ [expect]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
tcl - Expect/TCL telnet proc がプロンプトを待機しない
telnet ログインおよび送信コマンドのコマンドを送信する Expect proc があります。telnet proc 内で TFTP を実行します。ファイルサイズは10MBです。しかし、telent プロンプトは、プロンプトが表示されるまで待機しません。タイムアウト期間を待ってオフになります。
Expect でプロンプトを待つ方法はありますか。
よろしく、 ミトゥーン
perl - Perl CGI スクリプトをデバッグするにはどうすればよいですか?
削除される古いサーバーからレガシー Perl スクリプトを継承しました。スクリプトは新しいサーバーに実装する必要があります。新しいサーバーに入れました。
スクリプトは非常に単純です。expect と ssh を介してネットワーク デバイスに接続し、データを収集します。デバッグの目的で、デバイスからインターフェイスのリストを収集する部分のみを使用しています。
新しいサーバーのスクリプトは、ページをリロードしてから約 5 秒以内に常にページを表示します。まれに、リモート デバイスからのインターフェイスのリストが含まれます。最も一般的には、インターフェイスのリストを除くすべての HTML 要素が含まれています。
現在、古いサーバーでは、スクリプトがデータを出力するのに 20 秒かかる場合がありました。それは大丈夫でした。
これに基づくと、Perl スクリプトがデータを返し終わる前に、新しいサーバーの apache がデータを表示しているように見えますが、それは確かに正しくない可能性があります。
追加情報: 残念ながら、コードを投稿することはできません - 仕事の方針。ただし、expect の問題ではないと確信しています。予期される部分は、expect() または die('error msg') として記述されており、エラー メッセージが表示されません。ただし、expect timeout を 0 に設定すると、エラー メッセージが表示されます。
通常、スクリプトで使用されるタイムアウト値は 20 秒ですが、前述したように、apache は約 5 秒後にスクリプトから静的コンテンツを表示し、95% の時間で、expect から取得する必要があるコンテンツを表示しません。 . さらに、ページに表示されていない場合でも、スクリプトは期待されるコンテンツをドライブ上のファイルに書き込みます。
expect - 期待スクリプトのデフォルトのタイムアウトハンドラ
期待条件のいずれかが満たされない場合に失敗する必要がある期待スクリプトがあります。例えば:
期待スクリプトが一定時間内に「HelloWorld」を検出しない場合、失敗するはずです。期待のマニュアルによると、期待に条件を追加できますが、スクリプトtimeout
に多くのexpect
ステートメントがあり、それらすべてにタイムアウトを追加したくありません。それを行うためのより良い方法はありますか?
embedded - 交換を期待する
組み込みプラットフォームのシリアル ポートに接続されたモデムを使用したいと考えています。
これまでに拒否したいくつかの解決策を次に示します。
Expect と端末プログラム :
私の (クロス) ビルド システムには、expect のパッケージ ルールがありません。expect ソースからのインストール手順によると、configure スクリプトは、呼び出された端末で何らかのテストを行うため、対話型である必要があります。これは、クロス コンパイル時にやりたいことのようには見えません。Python と pyserial : これを使いたいのですが、全体のサイズが限られたフラッシュ スペースに収まりません。
チャット (pppd パッケージから): まあ、試してみるかもしれませんが、非常に限られています
だから私はある種の軽量で組み込み可能な代替品を探しています。luaの知識はありません。scipting のように期待するのに適した候補でしょうか?
ksh - 期待スクリプトで入力バッファをフラッシュするにはどうすればよいですか?
Expect スクリプトを作成していますが、(Linux で) シェル プロンプトの処理に問題があります。私の Expect スクリプトが生成rlogin
され、リモート システムが を使用してksh
います。リモート システムのプロンプトには、現在のディレクトリとそれに続く" > "
(スペースより大きい - スペース) が含まれます。スクリプト スニペットは次のようになります。
これは単純なコマンドでは機能しますが、送信しているコマンドが端末の幅 (より正確には、端末の幅と見なされるksh
) を超えると、問題が発生し始めます。その場合、ksh
は対話型コマンド ラインの奇妙な水平スクロールを実行します。これにより、プロンプトが書き直され、出力に余分な「 > 」が追加されたように見えます。当然、これにより、コマンドの実行後に出力に複数のプロンプトが表示されると、Expect スクリプトが混乱し、同期が取れなくなります (私のスクリプトには複数のsend
/expect
ペアが含まれています)。
PS1
リモートシステムを「prompt>」のようなより特徴的なものに変更しようとしましたが、同様の問題が発生し、これを解決する正しい方法ではないことがわかりました。
私が考えているのは、スクリプトが Expect に「この時点でリモート システムと適切に同期されていることがわかっているので、今すぐ入力バッファをフラッシュする」ことを伝える機能です。expect
ステートメントには、パターンが一致しても入力バッファーを破棄しない-notransfer
フラグがあるため、その逆が必要だと思います。
リモート シェルをより予測どおりに動作させるために使用できるその他の便利な手法はありますか? 生成されたセッションがリモート システムに対してインタラクティブに見えるようにするために、Expect が多くの作業を行っていることは理解していますが、より厄介なインタラクティブ機能 (の水平スクロールなどksh
)のいくつかをオフにしたいと考えています。 .
automation - (Tcl / Expect)終了後に画面をクリアする
(半)インタラクティブなexpectスクリプトを終了した後、(ローカルマシンで)画面をクリアしたい。スクリプト内からそれを行うことはできますか?これが私が試したものですが、失敗しました。
リモート側では、私はシェルではなく、ERPプログラムに参加しています。シェルを終了して、必要に応じてリモートホストで「クリア」を実行することもできますが、リモートホストのプロンプトは引き続き画面に表示されると思います。
編集:「exit」の前にクリアを試みるように変更されました(サブ質問:「execclear」はexpectスクリプトを実行しているマシンで実行されますか?)
scripting - Expect - 行と列に基づいて画面領域から変数を取得する
Expect を使用して、SSH セッションおよび ERP プログラムと自動対話しています。
私のexpectスクリプトで変数をキャプチャするために正規表現に頼るのではなく、ユーザーから特定のキーストロークを受け取ったときに、画面領域、たとえば1つのフィールドをコード内の変数にキャプチャすることは可能でしょうか? サーバーに他のコマンドを送信し、フィールドを再送信しますか?
注文番号が 6、12、6、18 (6 は行、12-18 は列) に含まれており、6 桁の注文番号が含まれているとします。行 6 列 12 から 18 までの注文番号を変数にコピーしたい。次に、ユーザーがもう少し対話できるように (または別のメニューに移動することを期待して)、別のメニューで注文番号を再送信します。
だから私の質問は次のとおりだと思います:現在の画面の内容は1つのバッファにありますか? (セッション全体ではありません) 画面上のその行と列の範囲にのみ存在する特定のデータ要素だけを抽出できますか?
サンプル擬似コード:
scripting - Unix用のTTYとcursesのドキュメントはどこにありますか?
私はSCOUnixで実行されているERPプログラムの自動化ツールに取り組んでいます。
Expectに関する私の質問を参照してください:
セッションで使用されている制御文字を理解するための、より具体的には、ERPプログラムとの対話中に画面上のフィールドの場所を決定するためのリソースを(ローカルまたはWeb上で)どこで見つけることができますか?
regex - Expect バッファ内の文字列を検索するための正規表現
エスケープ文字の文字列 (Expect 応答、この質問を参照) と 6 桁の数字 (英数字の最初の文字)に一致するように機能する正規表現を見つけようとしています。
識別する必要がある文字列全体を次に示します。
最終的に、文字列を抽出する必要があります。
これが私がすでに持っているものです:
その画面領域のフィールドであることを確認するために、エスケープ文字を特定する必要があります。したがって、その最初の部分を含む正規表現が必要ですが、バックスラッシュが混乱しています...
また、$number 変数に完全な文字列を取得したら、Tcl の別の変数の数値だけを分離するにはどうすればよいですか?
python - pythonを使用してopenvpnを実行することを期待
オープン vpn を自動的に実行するには python スクリプトが必要ですが、オープン vpn の実行には sudo を使用します
それが私の端末コマンドです。sudo のパスワードを入力する必要があります。pexpect を使用してそのコマンドを実行できますか? そして、openvpnが正常に実行されたかどうかを知りたいので、終了コードを取得する必要があります
ありがとう