🐙

一台のPCで複数のGitHubアカウントにSSH接続する際の設定方法

2024/01/14に公開

はじめに

私は、会社と個人用でGitHubアカウントを二つ作成しています。

一台のPCで会社用のリポジトリも個人用のリポジトリも操作したいと思い、どちらもSSH接続の設定を行いましたが、エラーが発生し少し躓いたためその時の解決方法を自分の備忘録も兼ねて記事にしました。

とはいえそんなに難しいものではなく、通常のSSH接続に加えてそれぞれのアカウント毎にエイリアスの設定をするだけで簡単に解決することができます。

それでは詳しく見ていきましょう。

🧞‍♂️記事を読むうえでのお願い

初心者向けになるべく分かりやすいように記載したつもりですが、ご不明点などありましたら追記・修正していきますのでお気軽にコメントください💁
また、私自身もまだまだエンジニアとしての経験が浅く、一部おかしな記述があるかもしれません。
そのためもし間違いなどがありましたらご指摘いただけると幸いです。よろしくお願いします🙏

(前提)GitHubへのSSHキー接続方法

基本的なSSHキー(公開鍵と秘密鍵)の作成方法、そのキーを使ってGitHubアカウントに接続する方法については、こちらの記事で纏めていますのでこちらを参照ください。

複数アカウントとも上記の記事のとおりSSH接続の設定は終えているものとして進みます。

エラー内容

先に会社用アカウントをデフォルトのパス=~/.ssh/id_rsaでSSH接続し、後から個人用アカウントの接続を行いました。

この状態で、個人用のGitHubアカウントのリポジトリへターミナルから操作(今回の場合はgit push)しようとした際に、以下エラーが出力されました。

ターミナル
$ git push origin main
ERROR: Permission to (個人用アカウント名)/(リポジトリ名).git denied to (会社用アカウント名).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
  • エラーの内容としては、会社用アカウントから個人用アカウントのリポジトリへのアクセス権限がないという意味になります。

個人用アカウントから個人用アカウントのリポジトリへアクセスしたいにもかかわらず、会社用アカウントからアクセスしようとしてしまっていることが原因のようです。

これを

  • 個人用アカウントのリポジトリへアクセスする時には、個人用アカウントから
  • 会社用アカウントのリポジトリへアクセスする時には、会社用アカウントから

と判別してくれるように設定することができれば解決しそうです。

解決方法

~/.ssh/configファイルの設定

上記で記載した判別を行うには、~/.ssh/configファイルの設定を行う必要があります。

以下のように個人用アカウントと会社用アカウントそれぞれに対応する秘密鍵のパスとエイリアスを記載します。

~/.ssh/config
# 個人用GitHubアカウント
Host github.com-private
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_private_ssh

# 会社用GitHubアカウント
Host github.com-company
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_company_ssh
  • Host:この部分がエイリアスになります。これは任意の値を設定いただいて問題ありません。
  • HostName:実際の接続先のホスト名またはIPアドレスを指定します。今回はGitHubへの接続のためgithub.comを記載します。
  • User:SSH接続時に使用するユーザー名を指定します。GitHubへのSSH接続の場合、通常はgitとなります。
  • IdentityFile:接続に使用するSSHキー(秘密鍵)のファイルパスを指定します。
    SSHキー作成時にファイル名を特段指定しなかった場合自動的に作成されたファイル名となっているかと思いますが、必要に応じて任意の分かりやすいファイル名に修正してください。その際.pubの公開鍵のファイル名も同じ名前に変更することを忘れないでください。
    私もSSHキー作成時にはデフォルトのパスで生成していましたが、ファイル名を修正しています。

上記設定が完了したら、以下コマンドで正しく設定できているかを確認してください。

ターミナル
$ ssh -T git@github.com-private
Hi (個人用アカウント名)! You've successfully authenticated, but GitHub does not provide shell access.
ターミナル
$ ssh -T git@github.com-company
Hi (会社用アカウント名)! You've successfully authenticated, but GitHub does not provide shell access.
  • git@の後ろの値は、~/.ssh/configで設定したHostの値を入力してください。
  • Hi移行の文章が表示されていれば問題なく設定できています。

git remoteの設定

git remoteコマンドにて、上記~/.ssh/configで設定したエイリアスに変更する。

ターミナル
git remote set-url origin git@github.com-private:(個人用アカウント名)/(リポジトリ名).git
  • git@に続く部分を先ほどの確認コマンドと同様に~/.ssh/configで設定したHostの値に変更する。
    今回の例の場合、デフォルトのgit@github.comとなっていたものをgit@github.com-privateに変更しています。

ここまでの設定を行うことで、リポジトリを操作する際にSSHキーとGitHubアカウントの紐付けが正しく行われるようになるため、先ほどエラーとなっていたgit pushコマンドが実行できるようになります。

☝️補足:エラー時になぜ会社用アカウントからの接続となっていたのか

上で述べたエラーの原因としては、会社アカウントから個人アカウントのリポジトリへアクセスしようとしていたからでした。

この時点では、~/.ssh/configファイルの設定を行っていませんでしたが、なぜ個人アカウントではなく会社アカウントでの操作となっていたのでしょうか?

その理由は、会社用アカウントのSSHキーのパスをデフォルトの~/.ssh/id_rsaにしていたから、となります。

以下のようにGitHubのデフォルトのHostName(github.com)をgit@以降に入力した場合には、デフォルトのSSHキーのパスである~/.ssh/id_rsaのキーをみにいく仕様となっています。

個人用アカウントはGitHubのリポジトリページに表示されているSSH形式のリモートリポジトリURLを使用してgit remoteコマンドを実行していたので、git@github.comのSSHキー、つまりは~/.ssh/id_rsaに記載されたSSHキーで設定されているアカウント(=会社用アカウント)と紐づいていることになります。

これによって、会社用アカウントから個人用アカウントのリポジトリへ操作を行おうとしていたのです。

ターミナル
$ ssh -T git@github.com
Hi (~/.ssh/id_rsaのSSHキーで接続したGitHubアカウント名)! You've successfully authenticated, but GitHub does not provide shell access.


また、GitHubアカウントが一つの場合に特段上記のような~/.ssh/configファイルの設定等を行わなくても問題なくSSH形式のリモートリポジトリURLを使用して操作が行えていたのは、SSHキーをデフォルトのパスで生成していたためということになります。

おわりに

以上が、一台のPCで複数のGitHubアカウントをSSHキー接続で管理する方法になります。

こんなの常識だよ!という方も多いと思いますが、個人的にはふわふわしていたSSHキーの理解も深まりいい経験でした!

同じようなエラーで躓いた方や一台のPCで二個のアカウントどうすんねん!という方の少しでも役に立てば幸いです。

ここまでお読みいただきありがとうございました!

Discussion