きり丸の技術日記

技術・エンジニアのイベント・資格等はこちらにまとめる予定です

【シェル】Expectで特定の文字を検出したら、別のコマンドを打って環境構築を自動化する

参考元の記事が優秀ですので、この記事は「やってみた」レベルの記事になります。詳しいことは参考元記事を参照してください。このコマンドを忘れていたので、私のメモ用記事でもあります。


環境構築時、ディスプレイに「password:」が出力されたら、自動的に用意したパスワードを入力したい。

その願いを叶えてくれるのが「Expect」コマンドです。

なお、多用は厳禁です。「rm -rf」で一斉にファイル削除するように、コマンド自体にインタラクティブな確認を挟ませないオプションがついているはずですので、そちらで対応するのが一般的でしょう。

なんでもできるコマンドだからこそ、どうしても必要なとき以外は使わないようにしましょう。

環境

ユースケース

  • 環境構築
  • 正常起動の監視
    • 30分経過しないと正常終了しないアプリケーション等々の監視
  • 他人が作ったシェルの結果に対して自動化

コマンド例

参考元のQiita記事引用。

#!/bin/sh

PW="Password"

expect -c "
set timeout 5
spawn env LANG=C /usr/bin/ssh hoge@ServerName
expect \"password:\"
send \"${PW}\n\"
expect \"$\"
exit 0
"

実際には違うコマンドを仕様していましたが、分かりづらかったので記事を引用します。

コマンド解説

参考元のQiita記事引用。

コマンド 説明
set timeout デフォルトのタイムアウトする秒数を指定します。指定しない場合は10秒となっています。
expect expectスクリプトで、マシンからの応答を読み取り、パターンマッチをする時に利用します。パターンマッチはswitch文、case文と同様の処理が実現できます。
spawn expect内でプロセスを生成するコマンドです。
send マシンに文字列を返答するコマンドです。
exit expectの処理を終了させ、返り値として指定した数字を返します。

その他の環境構築で便利そうなコマンド

yes


延々とyを出力するだけのコマンド。インストール中に全部Yで入力すればいい場合は、これで解決できる。

なお、yumを例にしているが、yumのオプションで-yがあるのでyumとは組み合わせる必要がない。

yes | yum install XXXXXX
yum -y install XXXXXX

他にもecho yで対策できます。yesで対応できない場合は、こちらで対応するのがいいでしょう。(参考記事参照)

終わりに

分かっていたら非常に便利なコマンドですが、普段使わないので思い出すのに時間がかかってしまいました。知識として機能を知っていたから、このコマンドがあるであろうシェルを片っ端から探して見つけました。

次に同じような環境構築をするときに、このブログにたどり着けることを未来の自分に期待します。


この記事がお役に立ちましたら、各種SNSでのシェアや、今後も情報発信しますのでフォローよろしくお願いします。

参考

敬称略。

ine1127:Linuxの対話がめんどくさい?そんな時こそ自動化だ!-expect編- qiita.com

maku693:Github Actionsでyesコマンドを使いたい時は代わりにecho yするといい maku693.hatenablog.jp

コマンドのインストール。Mac mojaveにはデフォルトで入っていました。

sudo apt-get install -y expect 

備考

用意していたコマンド。

OracleDBのDockerの起動に30分くらいかかるので、Dockerのログを追いつつ「DATABASE IS READY TO USE!」の正常終了メッセージが出力されたら、呼び出し元に完了したことを通知していました。

#!/bin/bash

expect -c "
set timeout 100000
spawn docker logs -f oracle.database
expect \"DATABASE IS READY TO USE!\"
exit 0
"

f:id:nainaistar:20210107220856p:plain