シェルスクリプトでMacのターミナル操作を自動化するのイメージ画像

シェルスクリプトでMacのターミナル操作を自動化する

  • 公開日:2018/05/09
  • 更新日:2018/10/19
  • 投稿者:n bit

ターミナルで頻繁に行うような操作はシェルスクリプト化しておくことでかなりの効率化が図れます。特にパスワード等の応答が数多くある場合、コピー&ペーストの回数も増えます。これらの1連の操作を自動化しておくことで檄的に作業効率を上げることができます。今回は自動応答を含めたシェルスクリプトの基本を解説します。

  • 効率化

この記事は約 分で読めます。(文字)

シェルスクリプトでMacのターミナル操作を自動化する

シェルスクリプトに必要となるモジュールのインストールから記述方法、起動方法まで、順を追って説明していきます。

expectをインストール

まずは対話形式のコマンドにも対応できるようにMacにHomebrewでexpectをインストールしておきます。expectとは、ターミナルから返されるコマンドの返答を識別し、次の入力を自動化します。パスワードの入力や、実行の”yes”、”no”を求める返答等も自動化できるのでとても便利です。

expectのインストールコマンド

$ brew install tcl-tk --without-tcllib

$ brew install expect --with-brewed-tk

シェルスクリプトの作成

expectのインストールが完了したらシェルスクリプトを記述していきます。

expectの記述フォーマット

コマンドの自動返答にも対応した基本的な記述フォーマットは以下のものになります。

#!/bin/sh


USER_PASS1 = '入力パスワードを記述'

expect -c "
set timeout 5
spawn [返答を求められるコマンドを記述]
expect \"password:\"
send \"${USER_PASS1}\n\"
interact
"

1行目の

#!/bin/sh

は、システムに記述内容がシェルスクリプト用の記述だと知らせるためのものです。

5行目以降の

expect -c "

set timeout 5
spawn
expect
send
interact
"

は、コマンドの自動応答に対応するための基本セットになります。SSH接続等によくあるパスワード入力を想定した記述にしています。こちらも1つずつ解説していきます。

expectを記述

expect -c "




"

は、今から自動応答に対応するためにexpectを記述しますと言うためのものです。expectで利用するコマンドをダブルクォーテーション「”」で囲んだ中に記述していきます。

時間間隔を設定

set timeout 5

は、各処理間の待ち時間やタイムアウトまでの時間を設定しています。設定している「5」と言う数字は秒数で1つの処理が終わってから次の処理が開始されるまでに5秒間間隔が開くと言うことです。または、入力等がなかった場合は5秒後に自動的に次の処理に移動します。

命令コマンドを設定

spawn

は、自動応答の元となるコマンドを記述します。SSH接続の場合であれば下記のように記述します。

spawn ssh -p 00000 -i "key" USER_NAME@000.000.000.000

応答内容を設定

expect

は、命令コマンドに対する応答内容を識別し次のコマンドに移行するかどうかを判定するためのものです。SSH接続の場合であれば通常「Enter passphrase for key 'key':」と言った応答内容を返されますので下記のように記述します。

  • 識別対象となる文字列を「\"」と「\"」で囲みます
expect \"Enter passphrase for key 'key':\"

ここで記述した内容と実際にコマンドから返答で返される内容を比較して同じであれば次の処理に進みます。上記の記述ではすべての応答内容を記載していますが、必ずしもすべての内容を記述する必要はありません。比較が行えるのであれば1部の内容でも可能です。

次の処理を設定

send

は、expectによって識別が完了し次の処理に進んだときに入力する文字列を記述します。下記の記述では変数を利用してパスワードを入力しています。

  • 変数を「${」と「}」で囲みます
  • 入力する文字列を「\"」と「\"」で囲みます
USER_PASS1 = '入力パスワードを記述'


send \"${USER_PASS1}\n\"

自動応答終了後の処理を設定

interact

は、自動応答終了後にセッションを自分に戻して操作できるようにする処理を設定しています。SSH接続の場合であればこの後手動でSSHの操作が行えます。これで一通りの設定作業が完了です。後はご自分のターミナルでのコマンドに基づいて記述を追加していってください。

シェルスクリプトの記述例

下記は私が実際にブログのプロジェクトファイル更新時に利用しているシェルスクリプトです。ローカル環境で修正したDjangoのプロジェクトファイルをpullして更新するまでの1連の流れ(要約版)を記述しています。1つの例として参考になればと思います。

#!/bin/sh


USER_PASS1='pass1'
USER_PASS2='pass2'

echo "Project Upload Start!"

cd /Users/xxxxx/Documents/blog/xxxx/templates/xxxx/xxxx
python replace_tool.py
cd /Users/xxxxx/ssh_server_key

expect -c "
set timeout 5
spawn ssh -p 00000 -i "key" USER_NAME@000.000.000.000
expect \"Enter passphrase for key 'key':\"
send \"${USER_PASS1}\n\"
expect \"%\"
send \"cd ~/blog\n\"
expect \"%\"
send \"hg pull -u\n\"
expect \"password:\"
send \"${USER_PASS2}\n\"
expect \"%\"
send \"cd ~/blog\n\"
expect \"%\"
send \"python manage.py collectstatic\n\"
expect \"Type 'yes' to continue, or 'no' to cancel:\"
send \"yes\n\"
interact
"

シェルスクリプトの起動

作成したシェルスクリプトを実際に起動していきます。作成したシェルスクリプトのファイルを拡張子.shで任意のディレクトリに保存してください。今回は「test.sh」で保存します。ターミナルを起動して先ほどシェルスクリプトファイルを保存したディレクトリに移動。

$ cd [保存先ディレクトリ]

作成したファイルに実行権限を付与します。

$ chmod 755 test.sh

後は下記のように入力し、シェルスクリプトファイルを起動すると記述内容が自動で実行されます。

$ ./test.sh

今日のdot

コマンド数が増えてくると色々とめんどくさいターミナルの操作ですがシェルスクリプトを作っておくことですべて自動化できます。ルーティーンであればかなりの効率化が図れますので作っておくと良いでしょう。