mac

 

macでsudoの対話をexpectで突破してapacheの操作を簡略化

sudoコマンドは対話式の入力が必要になります。sudoの対話はローカルの開発時には鬱陶しく作業効率を下げています。今回はローカル向けのsudoの対話突破汎用スクリプトを作ってみましょう。目標はローカルのapacheをスクリプト一発で対話無しに操作する事です。

新サイト、tree-mapsを公開しました!!

tree-maps: 地図のWEB TOOLの事ならtree-mapsにお任せ!

地図に関するWEB TOOL専門サイトです!!

大画面で大量の緯度経度を一気にプロット、ジオコーディング、DMS<->DEGの相互変換等ができます!

◯ 広告

大前提としてmac専用のコマンドに特化したサンプルなので注意して下さい。

まずはsudoの対話を突破するだけの汎用関数を作成します。

#!/bin/sh
auto_sudo() {
    cmdPath=$1
    cmd=$2
    user=$3
    password=$4

expect -c "
set timeout 300
spawn /usr/bin/sudo ${cmdPath} ${cmd}
expect {
    \"Password:\" { send \"${password}\n\" }
}
"
}

ファイル名をfunction.shとします。

linuxの場合は「Password」の部分が小文字だったりユーザ名が入ったりします。

続いてapacheの汎用起動・終了スクリプトを作成します。

#!/bin/sh
. `dirname $0`/function.sh

conf=$1
cmd=$2

usage() {
    echo "Usage: `basename $0` <httpd.conf> <start|restart|graceful|graceful-stop|stop>"
}

if [ ! -f ${conf} ]; then
    echo "${conf} is not found."
    exit 1
fi

USER="tree"
PASS="hogehoge"

case ${cmd} in
    start|stop|restart|graceful|graceful-stop)
        auto_sudo "/usr/sbin/apachectl" "-f ${conf} -k ${cmd}" "${USER}" "${PASS}"
        if [ $? -eq 1 ]; then
            echo "apache起動時にエラーが発生しました。"
            exit 1
        fi
        ;;
    *)
        usage
        ;;
esac
# apacheのプロセス起動まで一瞬待つ
sleep 1
# apacheプロセスの起動確認
ps -ef | egrep -v "/bin/sh|egrep" | egrep httpd

ファイル名をapachectl.shとします。

スクリプト中の「USER」「PASS」定数に自分のmacのID/PASSを設定して下さい

最後にsleep 1していますが、1秒待たないとプロセス起動前にpsしてしまうので待ちます。

linuxの場合はapachctlではなく「service httpd」や「/etc/init.d/httpd」になります。

最後に特定のプロジェクト専用のapache操作スクリプトを作成します。

実際はscmに環境毎のhttpd.confがあると思うので、httpd.confのパスをそれを指定して下さい。

#!/bin/sh
CONF=${HOME}/project/project-a/httpd.conf
$HOME/lib/apachectl.sh "$CONF" $1

ファイル名をapache.shとします。

どのプロジェクトでもapache.shという名前で統一し、同じ形式でapacheを操作できるようにしましょう。

プロジェクト毎に内容が異なるのはこのapache.shのみです。他は完全に同じになります。

実践では以下のような単純な構造ではないと思うので、サンプルとしてみてください。

${HOME}
├── lib
│   ├── apachectl.sh
│   └── function.sh
└── project/
    ├── project-a
    │   ├── apache.sh
    │   ├── httpd.conf
    │   ├── ssh-develop.sh
    │   ├── ssh-product.sh
    │   └── ssh-staging.sh
    └── project-b
        ├── apache.sh
        ├── httpd.conf
        ├── ssh-develop.sh
        ├── ssh-product.sh
        └── ssh-staging.sh

ではapache.shを実行してみましょう。どうなるか・・・

/
localhost:project-a tree$ ./apache.sh start
spawn /usr/bin/sudo /usr/sbin/apachectl -f /Users/tree/project/project-a/httpd.conf -k start
    0   889     1   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start
  501   891   889   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start
  501   892   889   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start
  501   893   889   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start
  501   894   889   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start
  501   895   889   0  5:43PM ??         0:00.00 /usr/sbin/httpd -f /Users/tree/project/project-a/httpd.conf -k start

やりました!

鬱陶しい対話のパスワード入力無しでapacheが起動できました!

このapache.shをプロジェクト毎に用意すれば、一瞬でプロジェクト毎のapacheの操作ができます。

◯ 広告