知識ベース

期待する

Expectは、Don Libesが作成したTCLスクリプト言語の拡張機能です。このプログラムは、テキスト端末インターフェースを公開するプログラムとの対話を自動化します。当初、1990年にUnixプラットフォーム用に作成されたExpectは、Microsoft Windowsおよびその他のシステムで利用可能になりました。

基礎

Expectは、Telnet、FTP、passwd、fsck、rlogin、tip、SSHなどの対話型アプリケーションの制御を自動化するために使用されます。 Expectは、擬似端末(Unix)を使用するか、コンソール(Windows)をエミュレートし、ターゲットプログラムを起動してから、ターミナルインターフェイスまたはコンソールインターフェイスを介して人間と同じように通信します。別のTcl拡張機能であるTkを使用してGUIを提供できます。

使用法

Expectは、既存のユーティリティをリンクする「接着剤」として機能します。一般的な考え方は、Expect内の問題を解決する方法を理解するのではなく、Expectがシステムの既存のツールを使用する方法を理解することです。

Expectの主な使用法には、商用ソフトウェア製品が含まれます。これらの製品の多くは、ある種のコマンドラインインターフェイスを提供しますが、通常、スクリプトを記述するために必要な能力がありません。製品を管理するユーザーにサービスを提供するために構築されましたが、多くの場合、企業は堅牢なスクリプト言語を完全に実装するためのリソースを消費しません。 Expectスクリプトは、シェルを生成し、環境変数を検索し、いくつかのUnixコマンドを実行してより多くの情報を取得し、ユーザーの目標を達成するために必要な情報を備えた製品のコマンドラインインターフェイスに入ります。コマンドラインインターフェイスを介して製品と対話することで情報を取得した後、スクリプトは、実行するアクション(存在する場合)についてインテリジェントな決定を下すことができます。

Expect操作が完了するたびに、結果は$ expect_outというローカル変数に保存されます。これにより、スクリプトは情報を収集してユーザーにフィードバックし、状況に応じて次に送信するものの条件付き動作も可能にします。

Expectの一般的な用途は、プログラム、ユーティリティ、組み込みシステムのいずれであっても、テストスイートをセットアップすることです。 DejaGnuは、テストで使用するためにExpectを使用して記述されたテストスイートです。 GCCのテストに広く使用されており、組み込み開発などのリモートターゲットのテストに非常に適しています。

「autoexpect」と呼ばれるツールを使用して、expectスクリプトの生成を自動化できます。このツールは、アクションを監視し、ヒューリスティックを使用して期待されるスクリプトを生成します。生成されたコードは大きくてやや不可解な場合がありますが、生成されたスクリプトを微調整して正確なコードを取得できます。

#$ remote_server、$ my_user_id、$ my_password、および$ my_commandがスクリプトの前の#で読み込まれたと仮定します。 #リモートサーバーへのtelnetセッションを開き、ユーザー名のプロンプトを待ちます。 spawn telnet $ remote_server expect "username:"#ユーザー名を送信し、パスワードプロンプトを待ちます。 send "$ my_user_id \ r" expect "password:"#パスワードを送信し、シェルプロンプトを待ちます。 send "$ my_password \ r" expect "%"#事前に作成されたコマンドを送信し、別のシェルプロンプトを待ちます。 send "$ my_command \ r" expect "%"#コマンドの結果を変数にキャプチャします。これは表示するか、ディスクに書き込むことができます。 set results $ expect_out(buffer)#telnetセッションを終了し、特別なファイル終了文字を待ちます。 「exit \ r」を送信eofを期待

別の例は、FTPを自動化するスクリプトです。

#タイムアウトパラメータを適切な値に設定します。 #たとえば、ファイルサイズは確かに大きく、ネットワーク速度は実際には1つの問題です。このパラメーターに値を設定することをお勧めします。 set timeout -1#リモートサーバーへのftpセッションを開き、ユーザー名のプロンプトを待ちます。 spawn ftp $ remote_server expect "username:"#ユーザー名を送信し、パスワードプロンプトを待ちます。 send "$ my_user_id \ r" expect "password:"#パスワードを送信し、ftpプロンプトを待ちます。 send "$ my_password \ r" expect "ftp>"#バイナリモードに切り替えて、ftpプロンプトを待ちます。 send "bin \ r" expect "ftp>"#プロンプトをオフにします。 send "prompt \ r" expect "ftp>"#すべてのファイルを取得send "mget * \ r" expect "ftp>"#ftpセッションを終了し、特別なファイル終了文字を待ちます。 「bye \ r」を送信する

以下は、SFTPを(パスワードを使用して)自動化する例です。

#!/ usr / bin / env expect -f#接続を試みる手順。結果がOKの場合は0、そうでない場合は1パラメーターセットユーザーセットパスワードセットホストセットロケーションセットファイル1セットファイル2 #puts "引数データ:\ n"; #puts "user:$ user"; #puts "passw:$ passw"; #puts "host:$ host"; #puts "location:$ location"; #puts "file1:$ file1"; #puts "file2:$ file2"; #{$ user == "" || $ passw == "" || $ host == "" || $ location == "" || $ file1 == "" || $ file2 == ""} {「使用法:ユーザー> パス> ホスト> 場所> 送信するファイル1> 送信するファイル2> \ n "exit 1} #sftpを指定されたホストに送信し、生成されたファイルを送信するsftp $ user @ $ host set rez connect $ passw

さまざまなプロジェクトが、C#、Java、Scala、Groovy、Perl、Python、Ruby、Shell、Goなどの他の言語でExpectのような機能を実装しています。これらは通常、元のExpectの正確なクローンではありませんが、概念は非常に似ている傾向があります。

C#

  • Expect.NET — C#(.NET)のExpect機能
  • DotNetExpect — .NET用のExpectにヒントを得たコンソール自動化ライブラリ

Java

  • ExpectIt — Expectツールの純粋なJava 1.6+実装。シンプルで使いやすく、拡張できるように設計されています。
  • expect4j —元のExpectのJavaクローンでの試み
  • ExpectJ — Unix expectユーティリティのJava実装
  • Expect-for-Java — Expectツールの純粋なJava実装
  • expect4java-ExpectツールのJava実装ですが、ネストされた構造をサポートします。 Groovy言語DSLのラッパーもあります。

スカラ

  • scala-expect — Expectツールの非常に小さなサブセットのScala実装。

グルーヴィー

  • expect4groovy-ExpectツールのGroovy DSL実装。

Perl

  • Expect.pm — Perlモジュール(metacpan.orgの最新バージョン)

Python

  • Pexpect —擬似端末で対話型プログラムを制御するためのPythonモジュール
  • winpexpect — Windowsプラットフォームへのpexpectのポート

ルビー

  • RExpect —標準ライブラリのexpect.rbモジュールの代替品。
  • Expect4r — Cisco IOS、IOS-XR、およびJuniper JUNOS CLIと対話する

シェル

  • 空— UNIXシェルスクリプトで対話型コマンドを実行するExpect-likeユーティリティ
  • sexpect —シェルに期待。クライアント/サーバーモデルに実装されており、アタッチ/デタッチ(GNU画面など)もサポートしています。

行く

  • GoExpect-Go言語用のExpect-likeパッケージ
  • go-expect-端末ベースまたはコンソールベースのプログラムの制御を自動化するための期待のようなgolangライブラリ。

さび

  • rexpect-Rust言語用のpexpectのようなパッケージ。

アーラン

  • lux-Expectスタイルの実行コマンドを使用したテスト自動化フレームワーク。