Windows 10 バージョン1607(Anniversary Update)からサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもUbuntuなどのLinuxディストリビューションが動作し、各種コマンドが利用可能になった。本連載ではWSLに関する情報を紹介する。

サーバー上のパッケージ処理をexpectで自動化する

以前の記事でも紹介した「expect」は、対話型なプログラムを自動実行するコマンドである。ルーチンワーク化した作業をスクリプトとして記述すれば、日常業務が効率的になるのは本稿読者であれば明らかだ。

もっとも筆者はサーバーの管理やメンテナンスを生業にしていないため、現場で活(い)かせる工夫とは無縁である。そこで徒然(つれづれ)と考えてみたところ、日々行っているのはOSのアップデートだった。仕事場にはWindows Server 2016のHyper-V上で動作するDebian GNU/Linuxが24時間稼働しているが、ここ数年はWebサーバーのApacheも稼働させず、MySQLも放置気味。

それでも年に数回は利用する場面があるため、セキュリティアップデートの適用は欠かせない。ご存じのとおりアップデート作業を自動化するcron-aptやunattended-upgradesが存在するものの、前述同様な理由で放置している。そこで思いつくのがexpectによる自動化だ。

今回はこのようなコンセプトでシェルスクリプトを作成したので、いつもと同じく任意のテキストエディターに下記の内容をコピー&ペーストし、実行フラグを付与してからお試し頂きたい。なお、3~6行のユーザー名やパスワードはご自身の環境に合わせて事前に変更する。

 #!/bin/sh

 USER={ユーザー名}
 PASS={パスワード}
 RPASS={rootのパスワード}
 HOST={接続するホスト名もしくはIPアドレス}

 expect -c "
    spawn ssh ${USER}@${HOST}
    expect \"s password:\"
    send \"${PASS}\n\"
    expect \"~$ \"

    send \"su\n\"
    expect \"パスワード:\"
    send \"${RPASS}\n\"

    send \"cd\n\"
    expect \"~# \"
    send \"apt-get update -y\n\"
    expect \"~# \"
    send \"apt-get upgrade -y\n\"

    expect \"~# \"
    send \"exit\n\"
    send \"exit\n\"

    exit
 "

シェルスクリプトを実行した状態。Linuxサーバーにssh接続し、aptコマンドを実行してパッケージを更新してから、ログアウトを実行する

それではシェルスクリプトと流れを紹介しよう。9~12行目は通常のログオン処理だが、最初に変数でユーザー名やパスワード名を用いて記述を省略している。14~16行目はrootに昇格するための処理だ。その後に続く18~22行目は、プロンプトの文字列を変更させるため、1度rootのホームディレクトリに移動してから、aptコマンドを実行する。24行目以降は前回同様のサーバーからのログアウト処理だ。

今回は試さなかったがホスト名をシェルスクリプトの引数として取得し、「expect { 文字列1 {処理1}; 文字列2 {処理2} };」と文字列部分に正規表現を用いてcase文のような分岐処理を加えれば、シェルスクリプトの応用性も高まるだろう。

阿久津良和(Cactus)