Umi Uyuraのブログ

Titaniumを使ったスマートフォンアプリ開発を中心に、プログラミング関連の作業ログ。

GitHub/Bitbucketなどで使うSSHキーを複数アカウントで使い分ける

個人でもGitHubやBitbucketのアカウントを持っている場合に、会社や別の会社のリポジトリにも同じサービスのアカウントを作ることになると、SSHキーをそれぞれに用意する必要がでてきます。

その際のconfigの書き方を毎回調べているので、自分用にメモ。

なお、環境はMacです。

SSHキーの生成

ssh-keygen コマンドを使ってSSHキーを生成します。

$ ssh-keygen -t rsa -C '<アカウント名やメールアドレスなど>' -f ~/.ssh/<ファイル名>

実行するとパスフレーズを求められるので、設定します。

ファイル名を分けておくことで、同一サービスに複数のファイル(アカウント)で利用することができます。

SSH公開鍵をサービスへ登録

SSH公開鍵をクリップボードへコピー

$ pbcopy < ~/.ssh/<ファイル名>.pub

GitHubへの登録

Bitbucketへの登録

SSH configの設定

同一サービスを複数のアカウントで利用する場合、 github.combitbucket.org へのリクエストがどのアカウント(つまりどのSSHキー)のものか区別できなくなってしまいます。

そこでSSHの設定ファイルで、複数アカウント用にエイリアスを作成します。

個人用のSSH configは ~/.ssh/config に作成します。

Host github.com
    HostName        github.com
    IdentityFile    ~/.ssh/github_rsa
    IdentitiesOnly  yes

Host hoge-github.com
    HostName        github.com
    IdentityFile    ~/.ssh/hoge_github_rsa
    IdentitiesOnly  yes

Host bitbucket.org
    HostName        bitbucket.org
    IdentityFile    ~/.ssh/bitbucket_rsa
    IdentitiesOnly  yes

Host fuga-bitbucket.org
    HostName       bitbucket.org
    IdentityFile   ~/.ssh/fuga_bitbucket_rsa
    IdentitiesOnly  yes

IdentitiesOnly は、その Host へ接続する際に指定した IdentityFile だけを使うという設定です。

これを付けておかないと、後述する接続確認の際、すでに同一の HostName へ接続したアカウントがあった場合、そのSSHキーを利用してしまうようなので、厳密にするために付けています。

接続確認

SSH configが正しく設定できたかどうか、各サービスへSSHで接続できるか確認します。

GitHubの場合

$ ssh -T git@hoge-github.com
Hi <ユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

Bitbucketの場合

$ ssh -T git@fuga-bitbucket.org
logged in as <ユーザー名>.

You can use git or hg to connect to Bitbucket. Shell access is disabled.

上記 ユーザー名 の部分に、保有している別のアカウント名が表示された場合は、すでに認証した別のアカウントのSSHキーが使われている状態です。

上記のSSH configの設定を見なおして、該当 Host の設定に IdentitiesOnly を付けて再実行することで、本来のアカウントで接続確認することができます。

cloneの方法 / 既存リポジトリの変更

~/.ssh/configHost を元ドメイン以外にしたものをcloneする場合は、通常であれば以下のように実行するところを、

$ git clone git@github.com:hoge/hoge-example.git
$ git clone git@bitbucket.org:fuga/fuga-example.git

ホスト名部分を設定した Host に合わせて変更して実行します。

$ git clone git@hoge-github.com:hoge/hoge-example.git
$ git clone git@fuga-bitbucket.org:fuga/fuga-example.git

既存リポジトリ

<プロジェクト>/.git/config を編集します。

...

[remote "origin"]
    url = git@github.com:hoge/hoge-example.git

...

を、

...

[remote "origin"]
    url = git@hoge-github.com:hoge/hoge-example.git

...

のように書き換えることで対応できるもよう。(試していない)

参考