プロキシサーバを手軽に設定する方法@Mac/Linux/Raspberry Pi

2017/07/27 pyenvでのproxy設定を追記
2016/11/24 proxy環境下で時刻合わせをする方法追記
2016/10/27 エディタの設定に関して追記
2016/09/23 gitに関して追記
2016/04/27 proxyを設定してくれるスクリプトをGitHubで公開

プロキシのうんこ

 会社とか、大学とかだとネットに接続する際にプロキシサーバを経由することになっている場合が多いですよね。Windowsだと色々懇切丁寧に説明ある場合が多いですが、MacやLinuxだと勝手にしてねという場合が多いですし、プロキシ有り無しを切り替えるのも面倒くさいし間違える元ですよね。
 そんな人たちのために、手軽にプロキシを設定する方法を紹介します。

プロキシ設定方法

 以下ターミナルで設定する場合です。

プロキシ設定スクリプト

 プロキシサーバがhttp://proxy.example.com:8080/だった場合の例です。プロキシサーバのアドレスとポートは適宜環境に合わせて読み替えてくださいね。

 まずは以下のコマンドでproxy.shというファイルを作成しましょう。

$ vi proxy.sh

 ファイルの中身は以下をコピペして下さい。大文字、小文字両方設定しているのは、大文字じゃないとNGとか小文字じゃないとNGとかいう、うんこソフトがこの世に存在するため(自分の記憶が確かなら実話)。

#/bin/bash
export http_proxy=http://proxy.example.com:8080/
export https_proxy=$http_proxy
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$http_proxy

 これで、プロキシ設定したい環境下では、起動した後以下のコマンドを実行すればプロキシ設定できます。

$ source proxy.sh

 プロキシ不要な環境の場合は、再起動するだけです。やっぱり設定したいとなったら、上記コマンド実行。ね、簡単でしょ?

上記設定だけではダメな場合

 上記だけだとダメな場合が色々あるのではまりやすいものだけメモ。その他ソフトや環境によって色々出てくるのでその都度調べて対応して下さい。

sudoしてたときproxy使いたい場合(apt-get等)

 環境設定、ユーザーが変わると引き継がれないです。sudoの場合も同様なのでスーパーユーザ権限が必要なコマンド(apt-getとかね)を実行したい場合は注意が必要です。環境設定引き継ぎたい場合はsudo -Eといった感じに-Eオプションが必要です。
 例えばapt-getのときは以下ね。

$ sudo -E apt-get update

 でも、これだと例えばsudoを多用するようなスクリプトを実行するとき全部にオプションつけないといけないので大変です。そういうときはvisudoを使うのがよいみたいです。以下コマンドを実行します。

$ sudo visudo

 ただ、何も設定しないままだと、visudoで普段使い慣れていないエディタが立ち上がってしまうので、例えばvimを使う人だったら、vimをインストールして、デフォルトのエディタ設定をしておくとよいかと思います。

 具体的には、以下でvimのインストールをして

$ sudo apt-get update
$ sudo apt-get -y install vim

 以下コマンドで使用するエディタを選択することが可能です。

$ sudo update-alternatives —config editor

 ずらずらっと、候補のエディタが表示されますので。/usr/bin/vim.basicのナンバを選択して下さい

 visudoすると、自動的に設定したエディタが起動するので下記を追記して下さい。

Defaults env_keep="http_proxy"
Defaults env_keep+="https_proxy"
Defaults env_keep+="HTTP_PROXY"
Defaults env_keep+="HTTPS_PROXY"

 そのまま上書き保存すると/etc/sudoersに上記内容が反映されます。これでsudo -E-Eオプションをつけなくてもproxy設定が適用されるようになります。

pipでproxy使う場合

 pip使う場合は、別で設定が必要です。具体的には以下のような感じです。

$ pip install pycrypto --proxy=http://proxy.example.com:8080/
wgetでproxy使う場合

 wgetの場合も個別にプロキシ設定が必要。~/.wgetrcを以下コマンドで編集

$ vi ~/.wgetrc

 中身は以下。

http_proxy=http://proxy.example.com:8080/
gitの場合

 exportでproxy設定するだけでも問題なく使用できますが、以下コマンドで設定してもOKです。

$ git config --global http.proxy http://proxy.example.com:8080/
$ git config --global https.proxy http://proxy.example.com:8080/

 また、https://xxx というアドレスならクローンできるけどgit://xxxというアドレスからはクローンできないというケースもあります。単純にhttps://に書き換えても良かったりするのですが、これまたスクリプトの中に紛れていたりすると面倒くさいので、以下を実行しておくとgit プロトコルの代わりに、http プロトコルでアクセスするようになるみたいです。

$ git config --global url.http://github.com/.insteadOf git://github.com/
時計をプロキシ環境下で合わせる方法

 proxy環境下だとntpも設定しないと正しく動作しないため、時間がずれてしまいます。特にRTCを持たないRaspberry Piは致命的です。そんなときは、以下コマンドをうってやれば瞬時に現在時間を取得して反映できます。

 まずは、上記のプロキシ設定方法を参照にexportでプロキシを設定します。そのあと、Linux/Raspberry Piの場合はターミナルで以下コマンドをうてば時間をネットから取得してきて設定できます。

$ sudo date --set @"$(wget -q https://ntp-a1.nict.go.jp/cgi-bin/jst -O - | sed -n 4p | cut -d. -f1)"

 /etc/rc.localに追記して起動時に現在時間取得したり、cronで定期的に時刻合わせするようにすると便利ですね。

 Macの場合は上記コマンドではうまくいかなかったので調査中です。

 コマンドの詳細に関しては、以下記事を参照して下さい。

ntpを使わずに時刻を合わせるワンライナー(Proxy環境下でも安心) - Qiita

pyenvでproxyを使う場合

 pyenvで pyenv installするとき、pip認証が必要で、proxy設定の他に、以下2行を実行する必要があるようです。

$ export PIP_INDEX_URL='http://pypi.python.org/simple/'
$ export PIP_TRUSTED_HOST='pypi.python.org'

 pyenvに関しては、以下記事参照下さい

proxyを設定してくれる便利なスクリプト

 コマンド一発でproxyを設定してくれるproxy.shをGitHubにアップしました。

非ターミナルに関して(Macの場合)

 ブラウザ等、ターミナルを経由しないで起動したアプリはプロキシが設定されません。ここらへんの挙動はOSによって異なって(多分)。Macだと、ネットワーク環境設定でプロキシを設定することになります。ただ、プロキシ環境と非プロキシ環境が混在していると、SSIDつなぐたびに、プロキシ設定をしたり解除するのは結構面倒で。そのため、ネットワーク環境(Location)を設定してやると、Locationごとにプロキシの設定有り/無しを設定できるので、簡単に切り替えることができます。

 このLocationはコマンドラインからでも切り替えられるので、更に便利になります。例えばプロキシ有りのLocationproxyとプロキシ無しのLocationnoproxyを作成しておけば、以下の要領で簡単にプロキシの有り無しを切り替えられます。

 プロキシ有り設定

$ scselect proxy


 プロキシ無し設定

$ scselect noproxy

 本当は、アクセスポイントに応じて自動で切り替えられると一番よいのですが、その設定はないようですね(iOSだとあるのに…)。以下のサイト参考にするともうちょい楽できそうですが、結局コマンドをうつことは変わらないので、私は普通にコマンドうつようにしています。


まとめ

 こうやってまとめると、改めてproxyは面倒臭いですね。どうしてもダメなら、テザリングするのが手っ取り早そうです。使い方によってはあっという間にパケ死してしまいそうですが。