21
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Macで処理中だけVPNに繋ぐコマンドを作りました

Posted at

リモート作業が増えて、何かと「あー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つしかない想定で、そのネットワークに接続するシェルになっています

  1. 上記のシェルを vpn と名付けて、
  2. chmod 744 vpn(実行権限を付与)
  3. PATHが通っている場所においてください

    (私は自作シェル置き場($HOME/binなど)を作って、

    .bash_profile.zshrcexport PATH=PATH:$HOME/binと書いてあります)

例えば、Web開発をしていて、フロントはローカルで起動するけど、APIはVPNを繋いだ先にある場合。
$ yarn server でローカルサーバーが起動するときは、

$ vpn pass "yarn server"

これで、サーバー終了時にVPNも自動的に切れます。

trap

シェルの trap ~ exit という行でこれを実現しています。
exit のところは err なども指定できるので、任意の終了シグナルに応じて処理を設定できるはずです。(やってみてない)

ただ、強制終了(9)は受け取れないようで、例えば、サーバーを起動しているvscodeのウインドウをそのまま閉じると、設定した処理は実行されません...

きもち

本当は、文字列としてコマンドを渡すなんてしたくない...
何か良い方法があったら教えて下さい...

21
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?