Windows 10で始めるBash (52) expectコマンドでクライアントからサーバー処理を自動化

Windows 10で始めるBash (52) expectコマンドでクライアントからサーバー処理を自動化

画像提供:マイナビニュース

Windows 10 Anniversary UpdateからサポートしたWSL(Windows Subsystem for Linux)。その結果としてWindows 10上でもBUW(Bash on Ubuntu on Windows)が動作し、各種Linuxコマンドが利用可能になった。本連載ではWSLに関する情報や、Bashから実行するシェルスクリプトを紹介する。

○expectコマンドでクライアントからサーバー処理を自動化

Linuxなどのサーバーにssh接続し、一定の処理をバッチファイルで行う業務を担う方は少なくない。本稿をご覧の読者なら、古くはTera TermやPuTTYのマクロで処理を自動化してきた経験をお持ちの方も多いはず。だが、専用のツールを使わずともBUW上に1つのパッケージをインストールすれば、対話式のコマンドに対しても一定の自動化が可能になる。それが「expect」だ。

expectはスクリプトの記述内容に応じて、対話的なプログラムと「会話」するプログラムである。歴史を振り返ればスクリプト言語のTclをベースに機能拡張を施したスーパーセット的存在だが、このあたりは知らなくても支障はない。まずは下記のシェルスクリプトをご自身の環境で実行してみよう。もちろん4行目のホスト名やユーザー名、6行目のパスワードはあらかじめ変更してほしい。

#!/bin/sh

expect -c "
spawn ssh サーバーのユーザー名@サーバーのホスト名orIPアドレス
expect \"s password:\"
send \"パスワード文字列\n\"
expect \"~$ \"
send \"echo ssh_test\n\"
expect \"~$ \"
send \"exit\n\"
expect \"~$ \"
"

すると下図のような実行結果が現れるはずだ。順番に説明すると3行目で「以降はexpectのスクリプト」であることを明言し、4行目のspawnは対話式に実行するコマンドを記述する。今回の例では「IPアドレス『192.168.0.3』を持つLinuxサーバーに、ユーザー『kaz』でssh接続を行う」流れだ。5行目は直前に実行した対話式コマンドから返される応答文字列を記述し、その結果がTrueであれば、6行目の内容をサーバーに送信する。この例ではダブルコーテーションで囲んだ「パスワード文字列+[Enter]キー」をサーバーに送信した。

後の流れはお察しのとおり。7〜8行はプロンプトの表示を待ってから「echo ssh_test」を実行(送信)。9〜10行もプロンプトの表示を待ってから「exit」コマンドを実行し、11行目でプロンプトが現れることを確認してから、スクリプトは終了する仕組みだ。なお、12行目はexpectのスクリプト終了を意味する。つまり、7〜8行目の部分を実際の業務内容に置き換えれば、Windows 10上から日々の業務を遂行可能となるわけだ。

使用頻度の高いコマンドもいくつか紹介しよう。「set timeout n」は標準入力から指定したn秒間応答がない場合にタイムアウトとなる。ただし、「-l」オプションを追加することでタイムアウトを抑止することも可能だ。「interact」はプロセス制御をユーザーに渡し、キー入力が可能になる。例えば自動判断しにくい部分をユーザーが判断して分岐させる場合に使うとよい。また、シェルスクリプト終了時に戻り値が必要な場合は「exit n」を使う。例えばサーバー側の問題で処理が実行できていない場合は「exit 1」で終了させれば、エラーレベルを元に処理の可否を判断できる。次回はもう少し複雑な処理方法を紹介しよう。

阿久津良和(Cactus)
(阿久津良和)