J

sshのプロキシ環境を自動切り替え

1. 目的

自宅と職場(あるいは学校など)でノートPCを持ち歩いていると、職場のプロキシ環境に設定したりする。 たとえば、プログラム言語Rはプロキシの設定を書いておかないと、install.packages()を使えなかったりする。 sshも例外ではない。プロキシ環境では、それに合わせて~/.ssh/configなどに設定をしておかなければならない。

しかし、いちいちネットワーク環境が変わるたびに設定ファイルを書き換えていては面倒である。ネットワーク環境に合わせて自動で切り替えてくれると便利だ。

特に、以前紹介した、homebrew-fileを利用する場合、この設定は有効である。

2. 方法

以前の記事

Mac のターミナルで、プロキシ設定を環境に合わせて自動切替 - joker8phoenix's diary

を拡張する。

ここでは、ターミナルを起動するたびに読み込まれる~/.bashrcを利用する。

2.1. 準備

ここでは、例として、github.comssh接続する場合を考える。 例として、

  • プロキシ環境を設定したネットワーク接続名: proxy
  • プロキシのアドレス: proxy.example.com
  • プロキシのポート: 8080

とする。

2.1.1. ~/.ssh/configファイルの準備

まず、sshconfigファイルに対して、プロキシ環境でない場合とプロキシ環境の場合の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

としておく。こうすることで、sshconfigを経由して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つ用意して、同じ方法で利用できる(と思われるが、試していない)。

以上。

参考文献

Mac のターミナルで、プロキシ設定を環境に合わせて自動切替 - joker8phoenix's diary

Yosemiteで、Homebrew環境構築手順(brew, brew cask, brew file)

1. Homebrewの環境構築

1.1. Xcode

Xcodeをインストールしてから、以下を実行し、Command Line Toolsをインストールする。

xcode-select --install

1.2. Homebrew

ターミナルを起動して、以下を実行。

% ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

さらに、以下を実行。

% brew doctor

警告の指示通りに解消させておく。

これでHomebrewは利用可。 さらに拡張していく。

2. 拡張(brew-cask, brew-file)

2.1. 準備

2.1.1. Github

gitをインストールしておく。

% brew install git

2.1.2. brew update

brew updatebrewで入れたツールのアップデートを確認するコマンド。 とりあえず、動作確認をしておく。

% brew update

git云々でうまくいかない場合は、以下を実行すると良い。

% cd $(brew --prefix)
% git fetch origin
% git reset --hard origin/master

2.2. Homebrew-Cask

Homebrew-Caskをインストールする。 通常のアプリをHomebrewで入れられるようになる。

% brew install caskroom/cask/brew-cask

2.3. Homebrew-file

2.3.1 brew-fileのインストール

Homebrew-fileをインストールする。 brewで入れたアプリの管理がとても楽になる

% brew tap rcmdnk/file
% brew install brew-file

2.3.2 gitにBrewfileを作成

次に、自分のGithub(無ければ作成しよう)で、Brewfileという新しいリポジトリを作成する。

2.3.3 gitのBrewfileをセットする

git上にあるBrewfileとMac上のHomebrewをつなげる(クローン作成)。

% brew file set_repo -r [Githubアカウント名]/Brewfile

うまくいったら、

% brew file edit

でBrewfileを閲覧・編集できることを確認する。

はじめは、Brewfileは空っぽなので、 brew file init によってBrewfileを、現在のbrewのインストール状況によって初期化するとよい。

2.3.4 Brewfileの編集

すでに、さまざまなアプリをインストールしていて、改めてCaskで入れなおしたい場合、以下を実行すると、Caskでインストールできるアプリを炙りだしてくれる。

% brew file casklist

この情報を、brew file editでBrewfileに書き込む。

2.4 Homebrewのアップデート

brewおよびbrew caskで入れたアプリをアップデートする。

2.4.1 brewのアップデート

以下のコマンドにより、アップデートとともに、Brewfileの更新を行ってGithubに同期してくれる。

% brew file update

2.4.2 brew caskのアップデート

caskでは、通常のアップデートだと、古いバージョンのアプリはすべて残っていく使用になっているが、最新版だけ残すためには以下を実行する。

% brew file cask_upgrade -C

古いバージョンも残していたいのであれば、

% brew cask update

でok。

参考文献

Homebrew — The missing package manager for OS X

Homebrew Cask

rcmdnk/homebrew-file · GitHub