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」文字列が応答として送信されます.
    #!/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 #