読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

GitHub (または Bitbucket) への接続アカウントを切り替える

Git SSH 認証

前提・目的

GitHub (または Bitbucket) に複数アカウントを所有しており、接続にはSSHを用いている。接続アカウントを状況により切り替えたい。

複数アカウントを運用する際には GitHub, Bitbucket の利用規約周りをちゃんと読んでおいたほうが良いと思う。僕自身には規約周りを人に説明できるほどの言葉が無いため、そのあたりの解説は本記事では行わない。

概要

  • 接続アカウントを切り替えたい。
  • git config で変わるのはコミット時Authorのみ。認証には関係ない。
  • 認証を切り替えるためには、SSH鍵の切替が必要。
  • 普段使っている鍵を書き換えるわけにはいかないので、別の鍵を作り、設定を行う。

git config について

コミット時のAuthorを切り替えるために、ローカルのリポジトリ内で以下を行っておこう。

$ git config user.name "名前"
$ git config user.email "メール"

ただしこれはサーバ接続時の認証には関係しないことに注意する。あくまでもコミット記録用である。

では何を以てアカウントの判別・認証を行っているのか

Git におけるSSH認証において git config はオマケである。あれのユーザ名とかメールアドレスはあくまでも自己申告であり、認証に使われるものではない。

認証に使われるのはSSH鍵である。

鍵があればアカウントが識別される

確認してみよう。

公開鍵の確認

普段 GitHub, BitBucket をSSH接続で使っているのであれば、鍵ファイルがあり、それが GitHub, Bitbucket 側にも登録されているはず。

$ cat .ssh/id_rsa.pub
ssh-rsa AAAA…JJbQ==   ← これが既にアカウントのSSH鍵設定に追加されているはず。

SSH接続してみる

あまり意識してないかもしれないが、そもそもSSH接続の際に指定しているのは、自分のアカウント名ではなく「git」なのである。

だが、実際に接続してみると、

$ ssh git@github.com
Hi kobake! …

$ ssh git@bitbucket.org
logged in as kobake. …

自分のアカウント名が含まれた応答メッセージが返ってくることから、正しくアカウント識別が行われていることが分かる。

上記で接続時に指定したのは以下のパラメータである。

  • ユーザ名 … "git"
  • ホスト名 … "github.com" (または "bitbucket.org")

さらに、明示的に指定しているわけではないけど、暗黙に送られているパラメータが以下である。

  • 公開鍵 … ~/.ssh/id_rsa.pub

公開鍵が送られているおかげで、gitサーバ側ではアカウントを識別することができる。(もちろん識別に加えて認証も行われる。その際には公開鍵に加えて秘密鍵も用いられる)

さて、アカウントを切り替えたいが。

以上のような理屈でアカウントが識別されているため、アカウントを切り替えるためにはつまり、端的にいうと、SSH鍵の切替が必要になる。

が、このSSH鍵、基本的に ~/.ssh/id_rsa.pub (および ~/.ssh/id_rsa) として置きっぱなしであり、普通は一度作った後に書き換えることはしないものであり、下手にこれをいじくると後々問題が起きかねない。

複数鍵を用意して切り替える

そんなわけで、以下の手順を踏むと良い。

  • (1) 新しくSSH鍵を作成する
  • (2) サーバ (GitHub または Bitbucket) 側の目的のアカウントに(1)の鍵を登録しておく
  • (3) 接続先の別名を作る。別名への接続の際には(1)の鍵を参照するようにする

(1) 新しくSSH鍵を作成する

hogekey という名前で作ることにする。

$ ssh-keygen -t rsa -f ~/.ssh/hogekey -C "適当なコメント"
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): (そのままEnter)
Enter same passphrase again: (そのままEnter)

(2) サーバ (GitHub または Bitbucket) 側の目的のアカウントに(1)の鍵を登録しておく

新しい公開鍵の内容をコピーし、

$ cat .ssh/hogekey.pub
ssh-rsa AAAA…J6lw==   ← 実際にはもっと長い文字列。これをコピー

サーバ (GitHub または Bitbucket) 側にSSH鍵を登録(ペースト)する。

(3) 接続先の別名を作る。別名への接続の際には(1)の鍵を参照するようにする

~/.ssh/config を編集する

Host hogehub                    ← 追記
  HostName github.com           ← 追記
  IdentityFile ~/.ssh/hogekey   ← 追記

Host hogebucket                 ← 追記
  HostName bitbucket.org        ← 追記
  IdentityFile ~/.ssh/hogekey   ← 追記

こうすると、SSH 接続先として hogehub という名前が有効になる。「ssh git@hogehub」のように接続しようとすると、実際には github.com に対して接続が試みられる。また、その際に利用されるSSH鍵は id_rsa ではなく hogekey のほうになる。(hogebucket についても同様)

確認

~/.ssh/config により作成した別名に対して接続してみる。

$ ssh git@hogehub
Hi kobake2! …

$ ssh git@hogebucket
logged in as kobake2. …

別名に紐づけられたSSH鍵のほうが用いられ、それに関連した別のアカウントが識別されたことと思う。

Git からの利用

~/.ssh/config で設定された接続先の別名は、Git からも認識される。
状況に応じて clone なり remote add なり remote set-url なりすれば良い。

clone

$ git clone git@hogehub:アカウント/リポジトリ.git

remote add

$ git remote add origin git@hogehub:アカウント/リポジトリ.git

remote set-url

$ git remote set-url origin git@hogehub:アカウント/リポジトリ.git

等々

後は好きに利用すれば良いと思う。

おしまい

賢明な方はお気づきかと思うが、この切替に使われる技術は本質的には SSH の設定であり、ほぼほぼ Git は関係がない。が、別にそんな技術レイヤーの切り分けを皆が理解しなければならないこともないし、現時点で Git ユーザが多くいる以上、本記事はこのタイトルで良いと思う。

ただ、ssh コマンドを直接自分の手で実行することは SSH の仕組みを理解する上で大事なことと思う。Git のアカウント切替のついでに、少しでも SSH の理解が深まれば幸いである。

});