Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【Shell】expectでシェルの対話的処理を自動化する

expect

expectは、シェル上での対話的なコマンドライン処理を自動化するためのツールです。

シェルスクリプトでルーチンを自動化したいときに対話的な処理が入ってしまって、どうしても手入力が発生してしまう・・・そんなときに重宝します。

Usage

実行環境はMac OS X High Sierra 10.13.4です。

brewGUIツールキットtcl-tkと、expectをインストールします。

$ brew install tcl-tk --without-tcllib
$ brew install expect --with-brewed-tk

tcl-tkのインストールは少し時間がかかります。

Source

以下にscpコマンドでのパスワード入力を自動化するスクリプト例を示します。

#!/bin/bash

TARGET="{target_path}"
PASSWORD="P@ssw0rd"

echo "copy .txt file in '${TARGET}' to remote server ..."

expect -c "
spawn scp ${TARGET}/*.txt usr01@10.132.235.71:~
expect \"usr01@10.132.235.71's password:\"
send \"${PASSWORD}\n\"
interact
"

expect -c

自動化対象となるコマンドリストを引数にとり、引数のコマンドを実行します。

spawn

expectの引数に渡されたコマンドリスト内で使用します。
対話処理を行うコマンドを引数にして渡すことで、後述するsendコマンドによる自動嘔吐が可能な状態になります。

send

spawnコマンドによって実行されたコマンドの対話処理に対して、どのような応答を行うかを定義します。

interact

自動応答処理を終了します。

参考

dot-blog.jp