プロキシ経由などhttpしか使えない環境でSSHと鍵を使ってGitHubにpushする方法
学校や会社などproxyを通してしかインターネットに接続できない環境で、GitHubにpushする最善の方法を模索して満足できる方法が見つかったのでメモします。Windowsの環境にだけしぼった方法ですがBK山盛りです。
問題・課題
プロキシ環境(http通信限定)でのgit操作
「httpでgitのremoteリポジトリと通信できるか?」は、gitの仕様では可能です。
但しリモートの環境でhttpが使えるようにセットアップしてある必要があります。
githubは使える事が確認済み。
認証方法
http通信だと認証方式がBasic認証になります。
Basic認証だとid:thincaさんが絶望しているような状況が発生するので、なんとか回避したく色々と調べたところgithubでは「ssh.github.com:443」でsshの鍵を使った認証ができるように提供していることがわかりました。
次の例はプロキシがない環境でPuTTYで接続する通常のssh接続です。
【セッション】
login as:git #ユーザー名はgitを入力 Server refused to allocate pty Hi guyon! You've successfully authenticated, but GitHub does not provide shell access.
一瞬だけ上記の表示がされてコンソールが終了します。
ユーザー名「git」は全ユーザ共通で、鍵でユーザの認識しています。
鍵はプロジェクトおよびアカウント画面で重複した登録ができないので、ユニーク性を確保したという感じでしょうか?
GitでPuTTYセッションを使う
次にgitプロトコルで上記認証方法を利用する場合です。
Gitはsshを使って鍵認証をしています。ssh接続でPuTTYセッションを使いたいと思います。
msysGitを使っている場合はインストール時に「SSHはOpenSSHを使う?それともplinkを使う?」という選択があったと思います。
あと、Gitは「GIT_SSH」という環境変数で使用するSSHプログラムを決めているので、この環境変数を変更してあげれば使用するSSHプログラムを変更できます。
plinkはsshのコマンドライン接続用ツールです。PuTTYのセッションも使用することができます。
TortoiseSVNでも使用(同梱)されています。
「システムのプロパティ」の「システム環境変数」にPuTTYに同梱されているplnkを指定します。
GIT_SSH => C:\puttypath\plink.exe
msysGitを使用している場合は「C:\Program Files\Git\setup.ini」を変更するだけでいけるかも
[Environment] GIT_SSH=C:\puttypath\plink.exe
ここでBK登場です。
plinkはごった煮版を使用した場合、下記のようなエラーが発生してきちんとpushできませんでした。
理由はわかりません。知っている方がいたら教えてください…
Unable to read from standard input
fatal: The remote end hung up unexpectedly
この情報がヒントになりました
JSR 168 and JSR 286 Portlet Development Blog - News, Articles, Tutorials, Tips, Tricks and Hints
http://portletwork.blogspot.com/2009/01/problem-with-git-on-windows.html
plinkはPuTTYのサイトからダウンロードしてリネームして使いました。環境パスで設定した名前もあわせて変更します。
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
もう一個plinkまわりではまったポイントがありました。
いつもはごった煮版PuTTYを使っていてiniファイルを使ってセッションを管理しているのですが、その場合は一度iniファイルをバックファイル化してレジストリにセッションを作る必要があります。iniファイルを使う機能はごった煮版の独自機能なので本家plinkの場合はセッションの記録先を使い分ける必要があります。
プロキシ用のセッションを作成
環境の準備が整ったら、plinkで読み込むセッションをPuTTYで作成します。
【セッション】
- セッション
- プロキシ(接続→プロキシ)
- Proxyのタイプ:HTTP
- Proxyのホスト:your_proxy_hostname(例:192.168.0.99)
- ポート:your_proxy_portnumber(例:8888)
- 鍵の読み込み(pagentもしくは接続→SSH→認証)
この作ったセッション名をgitプロトコル接続時に指定するので覚えておきます。
cloneとpush
git clone git@gitproxy:guyon/configs.git git push
gitproxyがセッション名になります。
これでcloneとpushができるはずです。
調べている過程でPuTTYセッションを使った方法以外にも色々な方法があったので、自分にあった方法で設定をするといいと思いました。
参考にした情報
Using Port 443 for SSH Connections
http://blog.codeslower.com/2008/8/Using-PuTTY-and-SSL-to-securely-access-GitHub-repositories-via-SSH
Unfuddle Support
http://unfuddle.com/community/forums/4/topics/362
JSR 168 and JSR 286 Portlet Development Blog - News, Articles, Tutorials, Tips, Tricks and Hints
http://portletwork.blogspot.com/2009/01/problem-with-git-on-windows.html
追記 2009/2/6
セッション名が間違っていたのを修正しました。