リモート作業が増えて、何かと「あーVPN繋がなきゃ」とかなるんですよね。
そして作業が終わってからVPNの接続を切り忘れる...
処理中だけVPNに繋がってくれてればいいのに...
そんなシェルを作りました
vpn
#!/bin/bash -eu
if [ $# == 0 ]
then
echo 'vpn [on|off|pass "command"]'
exit 1
fi
NETWORK_NAME=$(networksetup -listallnetworkservices | grep VPN)
off () {
networksetup -disconnectpppoeservice $NETWORK_NAME
}
on () {
networksetup -connectpppoeservice $NETWORK_NAME
}
case $1 in
'off' )
off
;;
'on' )
on
;;
'pass' )
on
trap off exit
eval $2
esac
使い方
※ 名前に「VPN」と入っているネットワークが1つしかない想定で、そのネットワークに接続するシェルになっています
- 上記のシェルを
vpn
と名付けて、 -
chmod 744 vpn
(実行権限を付与) - PATHが通っている場所においてください
(私は自作シェル置き場($HOME/bin
など)を作って、
.bash_profile
や.zshrc
にexport PATH=PATH:$HOME/bin
と書いてあります)
例えば、Web開発をしていて、フロントはローカルで起動するけど、APIはVPNを繋いだ先にある場合。
$ yarn server
でローカルサーバーが起動するときは、
$ vpn pass "yarn server"
これで、サーバー終了時にVPNも自動的に切れます。
trap
シェルの trap ~ exit
という行でこれを実現しています。
exit
のところは err
なども指定できるので、任意の終了シグナルに応じて処理を設定できるはずです。(やってみてない)
ただ、強制終了(9)は受け取れないようで、例えば、サーバーを起動しているvscodeのウインドウをそのまま閉じると、設定した処理は実行されません...
きもち
本当は、文字列としてコマンドを渡すなんてしたくない...
何か良い方法があったら教えて下さい...