6

Expect スクリプトを作成していますが、(Linux で) シェル プロンプトの処理に問題があります。私の Expect スクリプトが生成rloginされ、リモート システムが を使用してkshいます。リモート システムのプロンプトには、現在のディレクトリとそれに続く" > "(スペースより大きい - スペース) が含まれます。スクリプト スニペットは次のようになります。

send "some command here\r"
expect " > "

これは単純なコマンドでは機能しますが、送信しているコマンドが端末の幅 (より正確には、端末の幅と見なされるksh) を超えると、問題が発生し始めます。その場合、kshは対話型コマンド ラインの奇妙な水平スクロールを実行します。これにより、プロンプトが書き直され、出力に余分な「 > 」が追加されたように見えます。当然、これにより、コマンドの実行後に出力に複数のプロンプトが表示されると、Expect スクリプトが混乱し、同期が取れなくなります (私のスクリプトには複数のsend/expectペアが含まれています)。

PS1リモートシステムを「prompt>」のようなより特徴的なものに変更しようとしましたが、同様の問題が発生し、これを解決する正しい方法ではないことがわかりました。

私が考えているのは、スクリプトが Expect に「この時点でリモート システムと適切に同期されていることがわかっているので、今すぐ入力バッファをフラッシュする」ことを伝える機能です。expectステートメントには、パターンが一致しても入力バッファーを破棄しない-notransferフラグがあるため、その逆が必要だと思います。

リモート シェルをより予測どおりに動作させるために使用できるその他の便利な手法はありますか? 生成されたセッションがリモート システムに対してインタラクティブに見えるようにするために、Expect が多くの作業を行っていることは理解していますが、より厄介なインタラクティブ機能 (の水平スクロールなどksh)のいくつかをオフにしたいと考えています。 .

4

3 に答える 3

7

これまでにExpectが見たすべての出力を破棄したい場合は、試してください

expect -re $

これは、入力バッファの最後を意味する $ に対する正規表現の一致であるため、これまでに受信したすべてをスキップします。詳細については、Expect の man ページを参照してください。

于 2009-12-10T13:56:59.083 に答える
1

「set -o multiline」または COLUMNS=1000000 (またはその他の適切に大きな値) を試すことができます。

于 2009-12-09T21:37:26.807 に答える
0

私は過去にkshとExpectに苦労しました。私の解決策は、ログインシェルにksh以外のものを使用することでした。

リモートログインをksh以外に変更できる場合(chshコマンドを使用するか/ etc / passwdを編集する)、シェルとして/ bin/shを使用してこれを試すことができます。

もう1つの方法は、端末がダム端末であることをKSHに通知することです。特別な処理を行わないようにします。

$ export TERM=""

トリックを行う可能性があります。

于 2009-12-10T02:18:34.347 に答える