MacOSXで自動的にOpenVPN接続、SMB共有フォルダをマウントする

MacOSXでOpenVPNで接続して、接続先のSMB共有フォルダを自動的にマウントする設定をする必要があったのでごにょごにょいじってみました。


OpenVPNの接続はTunnelblickで接続しているが、基本的に全自動で接続させるため、「環境設定>ユーザーとグループ>ログイン項目」にTunnelblickを追加。

Tunnelblickのメニューから「VPNの詳細…」を選択し、接続させたい接続先を選択、接続方法を「Tunnelblick起動時に接続」に変更。
なお、Tunnelblickの接続先を共有設定にしておくと、「コンピュータ起動時に接続」にも設定できるのでこれで問題ない場合はその方がいいかも。
接続先を共有した場合のデメリットとしては、設定ファイルの編集をする際に一度共有を解除しないといけないので、今回はそれを避けるためにログイン項目にTunnelblickを入れ、Tunnleblick起動時に接続の形としている。

さて、問題のSMB共有フォルダのマウント。
通常GUIからマウントすると/Volumes以下に自動的にマウントされるが、同じ名前の共有フォルダをマウントすると勝手に名前の後ろに数字がついたりして変更されてしまうので都合が悪い。
使ってるアプリケーションの都合で、固定のパスにしたかったので、別途マウント設定をする必要があったので、以下のように設定。

まず、/Volumes以下は再起動時にクリアされてしまうので、別の場所にマウントポイントを設定。
ここでは/mnt/shareというフォルダを作成し、所有者をマウントするユーザーにしておく。
(自分のホームディレクトリで適当に設定するなら気にする必要はないことだが、管理者権限でないとフォルダ作成できない場所に作ったのでこのあたりが面倒)
なおこの作成するフォルダの所有者がマウントするユーザー以外のものになっていると、パーミッションの問題でマウントに失敗する。

さらに簡単にマウントさせるために、Automatorを使用。
Automatorで「ファイル>新規」を選び、ダイアログから「アプリケーション」を選択。
編集画面上で「ユーティリティ>シェルスクリプトを実行」を選び、右側のペインにドラッグ&ドロップ。

シェルスクリプトの入力画面が表示されるので、そこに以下のようなスクリプトを入力。

SERVER=172.17.0.250
DIR=/mnt/share/Test
if [ ! -d ${DIR} ] ; then
  for i in `seq 1 30`
  do
    if ping -o -t 1 ${SERVER} >/dev/null ; then
      umount /mnt/share
      mount -t smbfs //guest:@${SERVER}/share /mnt/share
      break
    fi
    sleep 1
  done
fi
このスクリプトの内容は

1行目:サーバーのIPアドレスをSERVER変数にセット
2行目:マウントの確認用ディレクトリをDIR変数にセット
3行目:マウントされているかどうかを共有ディレクトリの中にあるDIR変数のディレクトリの有無で確認。存在しない場合以下の処理を行うが、存在する場合はそのまま終了。
4,5行目:リトライのためforでループを回している。ここでは30回リトライするようにしている。
6行目:サーバーにpingを打ち、反応があれば以下の処理を行う。そうでない場合は11行目へに行き、1秒間スリープし、リトライ。
7行目:念のため一度アンマウントしている。これは何らかの不具合でマウントが残っている時にうまく行かなかったことがあったので入れているが、通常は無くても大丈夫。
8行目:/mnt/share以下にリモートのSMB共有ディレクトリをマウント。
9行目:強制的にforループを抜けて終了

という感じです。
pingで反応を確認しているのは、VPN接続が完了しない時点でこのスクリプトが走ってしまって、異常終了となるのを避けるためです。
なお、毎回1秒間のスリープで30回リトライするので、30秒以内にpingが返ってこないとマウントせず終了してしまうので、この繰り返し回数やスリープの時間は適宜調整が必要かもしれません。

コメント