レベルを上げた物理が殴る

ソビエトロシアでは、物理がレベルを上げてあなたを殴る!

大学のプロキシに通してgithub(とssh)を使う

プロキシに通してgitを使う

ググれば出てくるように、散々書かれている下記の解決策がある。

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

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

で、大学などは大抵22番ポートが塞がれていて、sshを使用するgit://スキーマで上記の設定を使うためにこれを追記する。

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

問題

通常はコレで解決するのだが、リモートリポジトリがgithubだとそうもいかないらしい(他は知らない)。

なぜかsshで通そうとする

$ git push
ssh: connect to host github.com port 22: Operation timed out
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

ssh: connect to host github.com port 22: Operation timed out

え?だってお前https使えって言ったやん。は?

解決策

以下を追記する。

$ git config --global url."https://github.com/".insteadOf git@github.com:

あ〜確かにgit://スキーマとは違うのでウ〜ムそうか…という気分になった。

問題2

当然httpsで接続を試みるので、毎回usernameとpasswordの入力を求められる。

Username for 'https://github.com': 
Password for 'https://nereith@github.com':

普段sshで作業してる自分にとっては厄介である。加えて、githubに二段階認証を設定しているとこの時ログインパスワードでは認証できず、github.comの設定画面から発行するバチクソに長いアクセストークンを入力しなければならない。やってられるか。

解決策2

ホームディレクトリ直下に.netrcというファイルを作る。内容は下記にならう

machine github.com
login [username]
password [password or token]

これで煩わしい認証画面から開放される。github万歳! 余談だが、当然中括弧は必要ない。

おまけ

プロキシを通してsshを使う

sshという古来より伝わる伝統的なコマンドがある。伝統的であるが故か、proxy環境下では厄介なことが起こる。

環境変数を読んでくれない

多くの場合、proxy環境下ではほとんどのプログラムが読んでくれるであろう環境変数HTTP_PROXY等にプロキシサーバーを記述するのが一般的であろうし、おそらく学外/学内、社内/社外ネットワークでそれらを切り替えるスクリプトを書いている人もいるだろう。

しかし、sshはわが道を征かんとばかりに環境変数を全スルーする。

解決策

そこで我々は、ssh様に以下の設定を記述せねばならない。 ~/.ssh/config

# プロキシ環境
Host hoge_proxy
User fuga
HostName example.com
ProxyCommand connect -H proxy.example.com:8080 %h %p
Identityfile ~/.ssh/id_rsa

# 通常環境
Host hoge
User fuga
HostName example.com
Identityfile ~/.ssh/id_rsa

こうすることで、プロキシ環境下では

$ ssh hoge_proxy

とすることで望んでいた接続が成功する。

……面倒臭い!だいたいなんでアクセス先ごとに設定ファイルを書かなきゃならねーんだよ。AWSインスタンスなんかリブートする度にconfig書き換えというザマである。もうアホかとバカかと。

しかし、ProxyCommandを使う以上の楽な方法は自分の稚拙なリサーチ能力では見つけることができなかった。無念。

なにかスマートなソリューションがイグジストするならテルミーして下さい。

補足

connectコマンドが使えない場合、環境がmacでHomebrewが使えるなら

brew install connect

でインストールできる。