Expect で対話コマンドを自動化

はじめに

Ubuntu Desktop 20.04 LTS に Expect をインストールして、対話コマンドを自動化するまでの手順です。

Expect とは

対話コマンドは、簡単にいうとシステムが入力を受付け、ユーザーが入力することで出力を返すコマンドです。
具体例でいうと、sudo 実行時のパスワード入力等がこれにあたります。

Expect インストール

既存のパッケージリストを更新

sudo apt-get update

Expect をインストール

sudo apt-get install expect

Expect を利用したスクリプト例

sudo df -h を実行するスクリプト例です。
パスワードの入力を求められると自動応答し、コマンドを実行します。

#!/bin/sh
password="password"
command="sudo df -h"

expect -c "
set timeout 5
spawn ${command}
expect {
        \"sudo\" { }
        timeout { exit }
}
send \"${password}\n\"
expect "

解説

最初の行は、実行時に sh や bash を指定せず実行するためのおまじないです。[1]shebang(シェバン)と呼ばれます。

# !/bin/sh

入力するパスワードを定義します。

password="password"

入力するコマンドを定義します。

command="sudo df -h"

expect -c ” と expect ” の間(~)の部分に実行する対話コマンドを設定します。

expect -c "
~
expect "

タイムアウトを設定します。単位は(秒)です。

set timeout 5

実行するコマンドを設定します。${ } で定義した変数(例では “sudo df -h”)を指定できます。

spawn ${command}

システムの応答に対してパターンマッチを行います。
ここで定義した文字列がマッチすると次の処理を行います。
なお、マッチしなかった場合も timeout 時間を超過すると次の処理に移行します。

expect {
~
}

システムの応答に「sudo」が含まれている場合、次の処理に移行します。
例えば、sudo を実行すると、”[ sudo ] ユーザー名のパスワード : ” と表示されますので、マッチ判定になります。

\"sudo\" { }

上述したとおり、マッチ判定でマッチしなかった場合もタイムアウトを超過すると次の処理に移行します。
そうならないように、timeout を超過すると処理を停止します。

timeout { exit }

システムの応答に対して返答するコマンドを設定します。
${ } で定義した変数(例では “password”)を指定できます。
\n は Enter 処理になります。 

send \"${password}\n\"

以上

参考書籍

created by Rinker
¥4,180 (2024/12/05 20:11:42時点 楽天市場調べ-詳細)

脚注

脚注
1shebang(シェバン)と呼ばれます。