Expectによる自動化されたインタラクション


*前に書く


最近開発されたプロジェクトでは、このような機能を実現したいと考えています.ローカルプロジェクト作成足場をリモートサーバに配置し、ユーザーがプロジェクトを作成する必要がある場合は、提供されたページにいくつかのプロジェクトインフラストラクチャを入力してコミットするだけで、バックグラウンドは選択に基づいてプロジェクトを自動化し、push上の倉庫を作成します.どのように見るかは非常に簡単なニーズであり、ユーザーがリクエストの作成を開始したときにshellスクリプトをバックエンドで呼び出し、この一連の操作を実現する必要があります.しかし、現在のプロジェクト作成足場ではマルチパラメータ転送はサポートされておらず、ユーザー入力で各パラメータ転送の操作を完了するしかありません.そこで本稿の主役であるExpectを投げ出し,一連の自動化インタラクティブ動作を実現する.

Expectの概要


expectは、人為的な介入を必要とせずに自動インタラクティブなタスクを実現するための無料のプログラミングツールです.はっきり言って、expectは自動インタラクティブ機能を実現するためのソフトウェアです.
実際の作業では、コマンド、スクリプト、またはプログラムを実行する場合、これらのコマンド、スクリプト、またはプログラムは、端末から実行を継続するコマンドを入力する必要がありますが、これらの入力は人為的な手動で行う必要があります.一方expectを用いると,プログラムのヒントに基づいてシミュレーション標準入力をプログラムに提供し,自動化インタラクティブ実行を実現することができる.これがexpect!!!

Expectコマンド


expectを使用する場合は、まずファイルの上部に#!/usr/bin/expectを書き込む必要があります.これはexpectファイルであることがプロセスに通知されました.シナリオ作成には、以下の「六」のコマンドがほとんど欠かせません.
  • spawn新しいプロセス
  • を開始
  • expectは、プロセスのフィードバックを待つために使用され、プロセスのフィードバックに基づいて、対応するインタラクティブな命令
  • を送信する.
  • sendは、ユーザが手動で入力コンテンツ
  • に代わるインタラクティブな値を送信する.
  • set変数値
  • を設定する.
  • expect eof自動化終了
  • interactは自動化を終了し、人工対話
  • に入る.

    Expect構文


    expectはtcl構文を使用しています.詳細チュートリアルはTCL基本構文-Tclチュートリアルを参照してください.ここではいくつかの簡単なプロセス制御を提供しています.一般的には十分です.

    伝参


    expectパラメータ値は$argvに格納され、例えば、最初のパラメータが[lindex $argv 0]であることを推定する.
    //      xxx.sh mike 22 engineer
    
    #!/usr/bin/expect
    set name = [lindex $argv 0]
    set age = [lindex $argv 1]
    set job = [lindex $argv 2]

    if/else

    if {$a == 'a'} {
      set flag = 0
    } else {
      set flag = 1
    }
    
    expect '*   xxx  *'
    send $flag

    ループマッチング


    一般にexpectマッチングが成功すると文は終了し、exp_continueはループマッチングを表す.キーワードを変更した後、最初から一致し続けます.たとえば、ソフトウェアをインストールするときに複数のyesを入力する必要があります.
    expect {
        "*yes/no*" {
            send "yes"
            exp_continue
        }
        eof
        {
            send "eof"
        }
    }

    くり


    未完待機