VPNで固定IPを手に入れたのは良いが、再起動したり切断されたりした場合、最接続してくれなくて困った。
ググったらそれっぽいのはあるのだが、ユーザーがログインしないと実行されないとか、Apple Scriptを利用するというものばかりだった。というかどこかのサイトが発祥で、それをコピペに近い状態でブログに転載しているのが多かったので新しい発見ができたサイトがあまりなかった。
とりあえず自分がしたいことは:
・ 起動時にLANに接続していたら、VPNへ自動で接続、ログインする必要無し。
・ 切断されたら最接続する。
・ apple scriptはよくわからないから使わない。
ということである。
自分で作ってしまうのが手っ取り早そうなので、作ってみた。下記のコードをvpn-connect.shというスクリプトを/etc/に作成。コードは下記の通り
これは一度実行するだけのコマンドであり、監視するわけではない。 次はlaunchdで上記スクリプトを実行し、1分単位で再実行する。 ログは/tmp/vpn-connect.outに書き出される。必要であればパスを変更してほしい。 下記コードを/System/Library/LaunchDaemons/jp.blogspot.r3wt3d.vpn-connect.plist という名前のファイルで(まあ名前はなんでも良い)保存する。
(2015/9/17 見直して全面的に書き直し)以前のものだとログがすごいことになるので、書き直した。
ただ実行毎にコンソールログに
と表示されまくるのが気に食わないが、10秒に一度表示されるよりは良いだろう・・・
下記コマンドを実行する(その後再起動する必要はない)か、再起動をすれば良い。
参考: launchd.infoとりあえず自分がしたいことは:
・ 起動時にLANに接続していたら、VPNへ自動で接続、ログインする必要無し。
・ 切断されたら最接続する。
・ apple scriptはよくわからないから使わない。
ということである。
自分で作ってしまうのが手っ取り早そうなので、作ってみた。下記のコードをvpn-connect.shというスクリプトを/etc/に作成。コードは下記の通り
#!/bin/bash
vpn="INTERLINK" #vpn名を入力。自分の環境に合わせる
localip="192.168.24.3" #ローカルIPアドレスを入力。固定IPにすると良い。自分の環境に合わせる
#modified from /etc/rc.common
CheckForNetwork()
{
local test
if [ -z "${NETWORKUP:=}" ]; then
#ここは$localipをgrepにて抽出し、1行以上あった場合NETWORKUPを-YES-に設定する。
#ここのgrep $localip 部分をを変更することでいろんな条件に変更できる。
test=$(/sbin/ifconfig -a inet 2>/dev/null | grep $localip | wc -l)
if [ "${test}" -gt 0 ]; then
NETWORKUP="-YES-"
else
NETWORKUP="-NO-"
fi
fi
}
CheckForVPN()
{
local test
if [ -z "${VPNUP:=}" ]; then
#vpnに接続しているかを確認する
test=$(/usr/sbin/scutil --nc status "$vpn" | sed -n 1p)
if [ "${test}" = "Connected" ]; then
VPNUP="-YES-"
else
VPNUP="-NO-"
fi
fi
}
# http://superuser.com/questions/358513/start-configured-vpn-from-command-line-osx
# を参考にする
#ここではVPNに接続したことを確認する。(20秒ほど)
isnt_connected() {
/usr/sbin/scutil --nc status "$vpn" | sed -n 1p | grep -qv Connected
}
poll_until_connected() {
let loops=0 || true
let max_loops=200
while isnt_connected "$vpn"; do
sleep 0.1
let loops=$loops+1
[ $loops -gt $max_loops ] && break
done
[ $loops -le $max_loops ]
}
#ここから実行される
#ネットワークが起動しているかを確認する
CheckForNetwork
if [ "${NETWORKUP}" = "-YES-" ]; then
#ネットワークが起動していたら、VPNが接続しているかを確認
CheckForVPN
if [ "${VPNUP}" = "-NO-" ]; then
#vpnが接続していなかったら、つなげる
dt=$(/bin/date)
echo "$dt: CONNECTING TO $vpn"
/usr/sbin/scutil --nc start $vpn
if poll_until_connected "$vpn"; then
echo "Connected to $vpn!"
exit 0
else
echo "NOT CONNECTED"
exit 1
fi
fi
fi
これは一度実行するだけのコマンドであり、監視するわけではない。 次はlaunchdで上記スクリプトを実行し、1分単位で再実行する。 ログは/tmp/vpn-connect.outに書き出される。必要であればパスを変更してほしい。 下記コードを/System/Library/LaunchDaemons/jp.blogspot.r3wt3d.vpn-connect.plist という名前のファイルで(まあ名前はなんでも良い)保存する。
(2015/9/17 見直して全面的に書き直し)以前のものだとログがすごいことになるので、書き直した。
ただ実行毎にコンソールログに
2015/09/17 21:46:52.580 com.apple.xpc.launchd[1]: (jp.blogspot.r3wt3d.vpn-connect) Service only ran for 0 seconds. Pushing respawn out by 60 seconds.
と表示されまくるのが気に食わないが、10秒に一度表示されるよりは良いだろう・・・
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">Label jp.blogspot.r3wt3d.vpn-connect Program /etc/vpn-connect.sh KeepAlive <true/>RunAtLoad <true/>ThrottleInterval 60 StandardOutPath /var/log/vpn-connect.out
launchctl load /System/Library/LaunchDaemons/jp.blogspot.r3wt3d.vpn-connect.plist
0 件のコメント:
コメントを投稿