6つのExpectスクリプトの例
3334 ワード
本文は以下のように訳す.http://www.thegeekstuff.com/2010/10/expect-examples/
Expectスクリプト言語は、インタラクティブプログラムへの入力を自動的にコミットするために使用されます.他のスクリプト言語よりも簡単です.expectスクリプトを使用するシステム管理者と開発者は、冗長タスクを簡単に自動化できます.その動作原理は、特定の文字列を待機し、対応する文字列を送信または応答することです.
次の3つのexpectコマンドは、インタラクティブなプロセスを自動化するために使用されます. send – プロセス に文字列を送信 expect – プロセスからの特定の文字列を待つ spawn – スタートアップコマンド
デフォルトでインストールされないため、システムにexpectパッケージがインストールされていることを確認してください.インストールすると、expect解釈器「/usr/bin/expect」が表示されます.一般的に、expectスクリプトファイルには.expの拡張子があります.
1.Expect「Hello World」の例
次のexpectスクリプトは、特定の文字列「hello」を待機します.それが見つかった場合(ユーザー入力後)、「world」文字列が応答として送信されます.
2.待機文字列タイムアウト
デフォルトでは、待機タイムアウトは10秒です.expectコマンドに何も入力しないと、20秒以内にタイムアウトします.次のようにタイムアウト時間を変更することもできます.
3.Expectによるユーザープロセスの自動化
Expectのヘルプでは、ユーザープロセスを自動化し、所望の出力を得ることができます.たとえば、Expectを使用してテストスクリプトを作成して、プロジェクトのテスト例を簡略化できます.
次の例では、追加のプログラム自動化を実行します.
上記のスクリプトを実行し、出力結果を以下に示します.
コードにinteractコマンドがない場合、スクリプトは文字列「23r」を送信するとすぐに終了します. interactコマンドは制御を実行し、addtionプロセスのジョブを処理し、予想される結果を生成します.
4. $expect_out変数の一致と不一致の内容
文字列マッチングに成功するとexpectが返されますが、それ以前に一致する文字列は$expect_に格納されます.out(0,string).前に受信した文字列に一致する文字列を加えて$expect_に格納out(buffer).次の例では、この2つの変数が一致する値を示します.
hello.plプログラムは、下図のように2行だけ印刷されます.
以下のように実行します.
5.SUを自動化して他のユーザーアカウントに登録する
Expectは、端末でパスワードを入力するのではなく、プログラムからLinuxログインアカウントにパスワードを渡すことができます.次のプログラムではsuが必要なアカウントに自動的にログインします.
上記のexpectプログラムを以下のように実行します.
上記のスクリプトを実行すると、balaユーザーアカウントからguestユーザーアカウントにログインします.
6.SSHは別のコンピュータに登録する
以下に示すexpectプログラム項目は、1台のコンピュータsshから別のマシンに自動的にログインすることができる.
上記のexpectプログラムを実行すると以下のようになります.
Expectスクリプト言語は、インタラクティブプログラムへの入力を自動的にコミットするために使用されます.他のスクリプト言語よりも簡単です.expectスクリプトを使用するシステム管理者と開発者は、冗長タスクを簡単に自動化できます.その動作原理は、特定の文字列を待機し、対応する文字列を送信または応答することです.
次の3つのexpectコマンドは、インタラクティブなプロセスを自動化するために使用されます.
デフォルトでインストールされないため、システムにexpectパッケージがインストールされていることを確認してください.インストールすると、expect解釈器「/usr/bin/expect」が表示されます.一般的に、expectスクリプトファイルには.expの拡張子があります.
1.Expect「Hello World」の例
次のexpectスクリプトは、特定の文字列「hello」を待機します.それが見つかった場合(ユーザー入力後)、「world」文字列が応答として送信されます.
#!/usr/bin/expect
expect "hello"
send "world"
2.待機文字列タイムアウト
デフォルトでは、待機タイムアウトは10秒です.expectコマンドに何も入力しないと、20秒以内にタイムアウトします.次のようにタイムアウト時間を変更することもできます.
#!/usr/bin/expect
set timeout 10
expect "hello"
send "world"
3.Expectによるユーザープロセスの自動化
Expectのヘルプでは、ユーザープロセスを自動化し、所望の出力を得ることができます.たとえば、Expectを使用してテストスクリプトを作成して、プロジェクトのテスト例を簡略化できます.
次の例では、追加のプログラム自動化を実行します.
#!/usr/bin/expect
set timeout 20
spawn "./addition.pl"
expect "Enter the number1 :" { send "12\r" }
expect "Enter the number2 :" { send "23\r" }
interact
上記のスクリプトを実行し、出力結果を以下に示します.
$ ./user_proc.exp
spawn ./addition.pl
Enter the number1 : 12
Enter the number2 : 23
Result : 35
コードにinteractコマンドがない場合、スクリプトは文字列「23r」を送信するとすぐに終了します. interactコマンドは制御を実行し、addtionプロセスのジョブを処理し、予想される結果を生成します.
4. $expect_out変数の一致と不一致の内容
文字列マッチングに成功するとexpectが返されますが、それ以前に一致する文字列は$expect_に格納されます.out(0,string).前に受信した文字列に一致する文字列を加えて$expect_に格納out(buffer).次の例では、この2つの変数が一致する値を示します.
#!/usr/bin/expect
set timeout 20
spawn "./hello.pl"
expect "hello"
send "no match :
"
send "match :
"
interact
hello.plプログラムは、下図のように2行だけ印刷されます.
#!/usr/bin/perl
print "Perl program
";
print "hello world
";
以下のように実行します.
$ ./match.exp
spawn ./hello.pl
Perl program
hello world
no match :
match :
5.SUを自動化して他のユーザーアカウントに登録する
Expectは、端末でパスワードを入力するのではなく、プログラムからLinuxログインアカウントにパスワードを渡すことができます.次のプログラムではsuが必要なアカウントに自動的にログインします.
#!/usr/bin/expect
set timeout 20
set user [lindex $argv 0]
set password [lindex $argv 1]
spawn su $user
expect "Password:"
send "$password\r";
interact
上記のexpectプログラムを以下のように実行します.
bala@localhost $ ./su.exp guest guest
spawn su guest
Password:
guest@localhost $
上記のスクリプトを実行すると、balaユーザーアカウントからguestユーザーアカウントにログインします.
6.SSHは別のコンピュータに登録する
以下に示すexpectプログラム項目は、1台のコンピュータsshから別のマシンに自動的にログインすることができる.
#!/usr/bin/expect
set timeout 20
set ip [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh "$user\@$ip"
expect "Password:"
send "$password\r";
interact
上記のexpectプログラムを実行すると以下のようになります.
guest@host1 $ ./ssh.exp 192.168.1.2 root password
spawn ssh [email protected]
Password:
Last login: Sat Oct 9 04:11:35 2010 from host1.geetkstuff.com
root@host2 #