work.log

元エンジニアの備忘録的ブログ

expectで対話型インストーラーの応答を自動化する

投稿:

expect で対話型インストーラーの応答を自動化しようという試みです。

対話型インストーラーがどんなのかというと、インストール途中で「(yes/no)」みたいに聞いてくるアレです。

適時メッセージを確認して選択したりもしますが、何度かインストールしている物とか全部デフォルトでっていう物何かだと、地味に面倒に感じるのでこれをスクリプトに任せようという魂胆です。

今回は、CentOS で VMwareTools のインストールを試しに自動化させてみたので書いて置こうと思います。

expect は yum でサクッとインストールを済ませておきます。

# yum -y install expect

次に expect.sh という名前でこんなスクリプトを用意します。

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin

expect -c "
    set timeout 10
    spawn perl vmware-tools-distrib/vmware-install.pl
    expect \"\[/usr/bin\]\"
    send \"\n\"
    expect \"\[/etc/rc.d\]\"
    send \"\n\"
    expect \"\[/etc/rc.d/init.d\]\"
    send \"\n\"
    expect \"\[/usr/sbin\]\"
    send \"\n\"
    expect \"\[/usr/lib/vmware-tools\]\"
    send \"\n\"
    expect \"\[yes\]\"
    send \"\n\"
    expect \"\[/usr/share/doc/vmware-tools\]\"
    send \"\n\"
    expect \"\[yes\]\"
    send \"\n\"
    expect \"\[yes\]\"
    send \"\n\"
    expect \"\[no\]\"
    send \"\n\"
    expect \"\[no\]\"
    send \"\n\"
    expect \"\[no\]\"
    send \"\n\"
interact
"
exit

後は、同じディレクトリ内に VMwareTools を展開してこのスクリプトを実行すると勝手にインストールが進んで行くと思います。

わざわざシェルスクリプト内で expect を実行しているのは他にやりたい処理があるからで、「#!/usr/bin/expect」として expect のみの処理を書いた方がスッキリはすると思います。

エスケープだらけで見づらいのですか、VMwareTools で順に聞かれる問いに対して「全てエンター」を押してデフォルトの設定を適用するという処理になります。

7 行目の spawn で VMwareTools のインストーラーを実行。
expect で「指定された問い」が出力されるまで待って、send で「応答」という感じです。

今回はインストーラーへの応答だけなのでこんな感じの簡単な処理になっていますが、SSH で接続して XXX が表示された場合には…何ていうちょっと手の込んだ処理も書く事ができます。

簡単ですが expect のメモ書きは以上になります。