sshのプロキシ環境を自動切り替え
1. 目的
自宅と職場(あるいは学校など)でノートPCを持ち歩いていると、職場のプロキシ環境に設定したりする。
たとえば、プログラム言語R
はプロキシの設定を書いておかないと、install.packages()
を使えなかったりする。
ssh
も例外ではない。プロキシ環境では、それに合わせて~/.ssh/config
などに設定をしておかなければならない。
しかし、いちいちネットワーク環境が変わるたびに設定ファイルを書き換えていては面倒である。ネットワーク環境に合わせて自動で切り替えてくれると便利だ。
特に、以前紹介した、homebrew-file
を利用する場合、この設定は有効である。
2. 方法
以前の記事
Mac のターミナルで、プロキシ設定を環境に合わせて自動切替 - joker8phoenix's diary
を拡張する。
ここでは、ターミナルを起動するたびに読み込まれる~/.bashrc
を利用する。
2.1. 準備
ここでは、例として、github.com
にssh
接続する場合を考える。
例として、
- プロキシ環境を設定したネットワーク接続名: proxy
- プロキシのアドレス: proxy.example.com
- プロキシのポート: 8080
とする。
2.1.1. ~/.ssh/config
ファイルの準備
まず、ssh
のconfig
ファイルに対して、プロキシ環境でない場合とプロキシ環境の場合の2つを準備する。
ターミナルにて
vi ~/.ssh/config_no_proxy
とし、config_no_proxy
の内容を
Host github.com
User git
Port 22
Hostname github.com
IdentityFile ~/.ssh/id_rsa
とする。
ssh
の鍵をid_rsa
としている。自身の鍵に合わせて、適宜書き換えていただきたい。
さらに、続けてターミナルにて
vi ~/.ssh/config_proxy
とし、config_proxy
の内容を
Host github.com User git Port 443 Hostname ssh.github.com IdentityFile ~/.ssh/id_rsa ProxyCommand corkscrew proxy.example.com 8080 %h %p
とする。
もし
corkscrew
をインストールしていない場合は、ターミナルにて
brew install corkscrew
として、インストールしておこう。
なお、プロキシのアドレスとポートは環境に合わせて適宜書き換えていただきたい。
さらに、ターミナルにて
cp ~/.ssh/config_no_proxy ~/.ssh/config
ln -fs ~/.ssh/config_no_proxy ~/.ssh/config
としておく。こうすることで、ssh
はconfig
を経由してconfig_no_proxy
を読み込むようになる。
2.1.2. ~/.bashrc
に記述
ターミナルにて
vi ~/.bashrc
として、その内容に以下を記述する。
############################# ### proxy trigger setting ### ############################# # 例として、 # システムのネットワーク接続環境の名前が、proxy # プロキシのアドレス: proxy.example.com # プロキシのポート: 8080 # の場合 proxy=http://proxy.example.com:8080 switch_trigger=proxy # ネットワーク接続の名前 # プロキシ環境ではない場合の設定ファイルにリンクを貼る ln -fs ~/.ssh/config_no_proxy ~/.ssh/config if [ "`networksetup -getcurrentlocation`" = "$switch_trigger" ]; then export HTTP_PROXY=$proxy export HTTPS_PROXY=$proxy export ALL_PROXY=$proxy # プロキシ環境の設定ファイルにリンクを貼る ln -fs ~/.ssh/config_proxy ~/.ssh/config fi
ターミナルを起動するたびに、
.bashrc
が読み込まれて、そのときのネットワーク環境を取得し、もしもプロキシ環境であればif
からfi
までに記述した内容が実行される。
これにより、~/.ssh/config
のシンボリックリンクは、ネットワーク環境に合わせて、適切な設定ファイルへとリンク付けされる。
以後、ssh
を利用するときにネットワーク環境を意識する必要はない。とても便利。
なお、
R
でプロキシ環境に合わせる場合は、~/.Renviron
に
http_proxy=http://proxy.example.com:8080/
を記述すると良い。これも、プロキシ用とそうでないものを2つ用意して、同じ方法で利用できる(と思われるが、試していない)。
以上。