1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

linux オートメーション インタラクション スクリプト 説明

2022-02-12 21:40:02

I. はじめに

expectスクリプトは、Tclスクリプト言語の拡張機能です。人が介在しない対話的な作業を自動化するために使用されます。実際の開発では、シェルスクリプトを実行する際に、linuxのパスワードやmysqlのパスワードなどを入力することがありますが、expectがそれを代行してくれます。

II. インストール

ExpectationはLinuxに付属していませんので、自分でインストールする必要があります。

sudo apt-get update
sudo apt-get install expect

III. 簡単なexpectスクリプト

3.1. スクリプトの書き方

まず、expectスクリプトを作成します。

sudo vim hello.exp

hello.expの下に以下のように記述します。

#! /usr/bin/expect

set timeout 5

spawn su

expect {
  assword {send "123456\r"} # your linux password
}

interact

hello.expの実行

expect hello.exp

実行すると、ユーザーがrootになることがわかります。linuxを使ったことがある人ならわかると思いますが、rootユーザーになるにはパスワードを入力する必要があります。これがexpectの自動対話です。

3.2. スクリプトの説明

(1) #! /usr/bin/expect
シェルスクリプトと同じように、実行するスクリプトを指定します。 #! /bin/bash expectがどこにインストールされているのかわからない場合は which expect を参照してください。私のは /usr/bin/expect にインストールされています。

(2) タイムアウト5を設定
set: を設定するセット変数です。 カスタム変数 を設定し、さらにexpectスクリプトを設定することができます。 内部変数 の値です。
のタイムアウトが発生します。 タイムアウト は、expectスクリプトの 内部変数 を使用することはできず、私たちのカスタム名を使用するには、この 内部変数名 タイムアウトは秒単位で、デフォルトは10秒、-1を指定するとタイムアウトしない。

set timeout 5: expect文の中で、5秒後にタイムアウトが切れ、それ以上選択されないことを意味します。

(3) スポーン・スー
新しいプロセスを開始して実行する su コマンド

(4) expect { assword send {"123465r"}}.
expect: プロセスから情報を受け取り、マッチングに成功したらexpect後のアクションを実行する
send: プロセスに文字列を送信する

expect { 
	assword send {"123465\r"}
} 

説明 出力に assword を送信し、もしそうなら、コマンド 123456\r (そうでない場合は、タイムアウトを待ってexpect文を終了します。

(5) 対話する
spawnでコマンドを実行した後は、終了せず、残りの操作を手動で行います。例えば、sshにログインする場合、expectスクリプトが(パスワードを手入力することなく)代わりにログインしてくれ、その後、手動で操作する必要があるのです。

3.3. まとめ

この時点で、expectスクリプトの本質は既にお分かりだと思います。linuxが何を返すかを事前に知っていて、その情報を取り込んで対応する。

IV. 本体

4.1、コモンコマンドの説明

<テーブル コマンド 説明 タイムアウトを設定する n expect文のタイムアウトをn秒に設定します。-1は決してタイムアウトしません 名前の設定値 変数名をnameに、値をvalueに設定する 名前を設定する [インデックス $argv 0]. expectスクリプトに渡された最初の引数の値を変数名として設定します。第1引数のインデックスは0、第2引数は1、...となります。 スポーン 新しいプロセスを開始したり、コマンドを実行したり、プログラムを指定したりします。 期待する 処理で返された情報を受け取り、マッチングが成功した場合(大文字小文字を区別する)、expect後のアクションを実行する 送信 プロセスへ文字列を送信する send_user メッセージを表示するために使用します。シェルのechoに相当します。 exp_continue post-expectアクションを実行した後、expectを終了せず、マッチダウンを継続するようにする 期待する ユーザーとのインタラクションを許可せず、ただ終了させる (これはインタラクションよりも多く使われるでしょう) 対話 ユーザーとのインタラクションを許可する

4.2. 例 シェルスクリプトの実行

(1) シェルスクリプト1.shを作成します。

#! /bin/bash

echo "read print"
read -p "please input name in there " NAME
echo ${NAME}

read -p "input password in there " PASSWORD

echo ${PASSWORD}

このスクリプトは、アカウント番号、パスワードを入力し、それを印刷するためのものです。

(2) expectスクリプト、1.expを作成します。1.expに情報を入力してもらう

#! /usr/bin/expect

# To run the shell script, write the absolute path to the shell script
spawn bash /home/hadoop/test/1.sh

# Set the timeout for the expect statement. Default is 10s
set timeout 3

expect {
  #expect is similar to a swtich statement in that it matches the statement inside the parentheses {}, and as soon as it finds a match, it will execute
  #expect will exit after execution, but not after adding exp_continue, it will continue to execute.

  #Here is the match string, no double quotes, case sensitive
  name {
    send "meizhaowei\r"
    send_user "success\n"
    # send back a message to the user, similar to echo, print the message to the console
    
    exp_continue
  }
  assword {send "123456\r"}
}

expect eof # the opposite of interact, executing the program without going into manual interaction

(3) 実行

通常、1.shを実行すると、名前とパスワードを手動で入力するよう求められますが、ここでは、1.expを実行した後、1.expに1.shの情報を入力させることができます

expectの構文をもっと深く掘り下げたい場合は、以下のマニュアルを参照してください。
オリジナルの英語版:http://www.tcl.tk/man/expect5.31/expect.1.html
中国語翻訳: https://blog.csdn.net/cbuy888/article/details/80561461

この記事は、linuxの自動化対話スクリプトexpectについて紹介されています。もっと関連するlinuxの自動化対話スクリプトexpectの内容は、スクリプトハウスの過去の記事を検索してください。