OS Xのネットワーク環境に合わせてHTTP_PROXYを切り替えるシェルスクリプト

大学のネットワークに接続している時だけプロキシを設定したい時がある。

Mac のネットワーク環境はnetworksetup -getcurrentlocationコマンドで取得することが出来るので、

.zshrc 辺りに以下のシェルスクリプトを書いておけば Terminal で新しいタブを開いた時に自動でプロキシを設定してくれる。

proxy=proxy.hogehoge.ac.jp
switch_trigger=大学

if [ "`networksetup -getcurrentlocation`" = "$switch_trigger" ]; then
  export HTTP_PROXY=$proxy
  export FTP_PROXY=$proxy
  ...以下省略
fi

Git のプロキシ設定も書き換えたい

Git は http_proxy を見てくれないのでリモートリポジトリに push 出来なくて困ることがあった。そこで http_proxy と一緒に Git のプロキシ設定も書き換えるようにしたい。

Git のプロキシは以下のコマンドで設定出来る。--globalの代わりに--systemを使っても良い。

git config --global http.proxy $proxy
git config --global https.proxy $proxy
git config --global url."https://".insteadOf git://

逆に git config から設定を削除したい場合はgit config --gobal --unset {item}を使えば良い。

先ほどのコマンドと組み合わせることで最終的なコードは以下のようになる。

switch_proxy.sh
proxy=proxy.hogehoge.ac.jp:80 switch_trigger=大学 function set_proxy() { export http_proxy=$proxy export HTTP_PROXY=$proxy export ftp_proxy=$proxy export FTP_PROXY=$proxy export all_proxy=$proxy export ALL_PROXY=$proxy export https_proxy=$proxy export HTTPS_PROXY=$proxy git config --global http.proxy $proxy git config --global https.proxy $proxy git config --global url."https://".insteadOf git:// } function unset_proxy() { unset http_proxy unset HTTP_PROXY unset ftp_proxy unset FTP_PROXY unset all_proxy unset ALL_PROXY unset https_proxy unset HTTPS_PROXY git config --global --unset http.proxy git config --global --unset https.proxy git config --global --unset url."https://".insteadOf } if [ "`networksetup -getcurrentlocation`" = "$switch_trigger" ]; then echo "Switch to proxy for university network" set_proxy else unset_proxy fi

このコードを .zshrc に保存して適当なターミナルで新しいセッションを開くと、switch_triggerで指定されたネットワーク環境下にいる時だけプロキシを通すことが出来る。

しかし既に開いているセッションに対してプロキシを適用する方法はわからなかった。

Workaround として、コードを ~/.switch_proxy 辺りに置いて、

~/.zshrc
alias nswitch=~/.switch_proxy

.zshrcに書いておくことで、nswitchとタイプしてプロキシを切り替えられるようになる。