FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

複数のGitHubアカウントに対して複数のSSHキーを設定するための方法

人によってはGitHubのアカウントを2つ以上持っていたり、社内で複数のGitHubアカウントを使い分ける必要があったりする場合がある。 例えば仕事用と趣味用でGitHubアカウントを2つ用意していたり、その場合は1つのPCから複数のGitHubに対して制御を行う必要がある。

この場合、SSHキーをどうすればよいのかという問題だが、単純に同じSSHキーを登録しておけばいいんじゃない?と思っていたら、それはGitHub的に使用できないらしい。 実際、別のアカウントでGitHubに登録しているSSH公開鍵をもう1つのGitHubのアカウントで登録しようと売ると、「このキーすでに使われてるぞ」と怒られてしまう。

f:id:msyksphinz:20191023222033p:plain

そこでどうするかというと、手元のPCでもう一つのSSHキーを生成する。例えばこれをid_rsa_selfとする。 すると、新たに~/.ssh/id_rsa_self.pubが生成されるので、これをGitHubに登録するわけだ。

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/msyksphinz/.ssh/id_rsa): /home/msyksphinz/.ssh/id_rsa_self
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_rsa_self.
Your public key has been saved in id_rsa_self.pub.
The key fingerprint is:
...

そしてこの2つをどのようにして使い分けるかという話だが、このためには~/.ssh/configに設定を記述することになる。

  • ~/ssh/config
# Personal GitHub account
Host msyksphinz
 HostName github.com
 User git
 AddKeysToAgent yes
 IdentityFile ~/.ssh/id_rsa

# Work GitHub account
Host msyksphinz-self
 HostName github.com
 User git
 AddKeysToAgent yes
 IdentityFile ~/.ssh/id_rsa_self

configファイルはパーミッションを600にしないと警告されるので気を付けること。

2つのコンフィグレーションを用意した。どちらともHostNamegithub.comに設定しているのだが、IdentityFileをそれぞれ別のファイルに設定している。

そしてこのコンフィグレーションをどのように使い分けるのかということだが、これはgit cloneなどの時にアドレスとして使える。 つまり、上記の場合でmsyksphinz-selfのキーを使ってcloneしたい場合、以下のようにすればよい。

git clone git@msyksphinz-self:msyksphinz-self/rumy-make.git

msyksphinz-self:で、msyksphinz-selfのアカウントでgithub.comへのアクセスを行ってくれる。 .git/configを見てみると、URLとしてはmsyksphinz-selfを使ったアドレスになっているので、既存のClone済みのリポジトリについても同じようにURLを変更すれば、複数のGitHubアカウントを使い分けることができるようになる。

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = git@msyksphinz-self:msyksphinz-self/rumy-make.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master