AI can fly !!

AI がやりたい Web エンジニアのアウトプット (AI の知識は無い)

【GitHub】複数の GitHub アカウントを SSH 接続で使い分ける【Git】

GitHub

はじめに

ちょっと検索するだけで同じような内容の記事が山ほど出てきますが、同一マシン上で複数の GitHub アカウントへの SSH 接続を使い分ける方法についてまとめてみました。

例えば、仕事用の Pro アカウントとプライベート用の Free アカウントや、プロジェクト毎に Pro アカウントを使い分ける場合などを想定しています。

尚、一個人が無料の GitHub アカウントを複数保持することは、規約違反にあたりますのでご注意ください。

help.github.com

前提条件

  • ローカルマシンに Git をインストール済み
  • 複数の GitHub アカウントを保持している
  • Git / GitHub / SSH の基礎知識、使用経験がある

動作環境

OS Version
Windows 10 Pro 1909
Application Version
Git 2.26.0
PowerShell 5.1.18362.752
Hosting Service
GitHub

GitHubSSH 接続する

まずは、各 GitHub アカウントで GitHubSSH 接続できるように設定します。

保持している GitHub アカウント分の SSH キー (公開鍵と秘密鍵) を作成し、それぞれの GitHub アカウントに公開鍵を登録しましょう。

ちなみに、 GitHub ヘルプにも詳しい手順が記載されています。

help.github.com

1. SSH キー (公開鍵と秘密鍵のペア) を作成

1). ssh-keygen コマンド実行

ssh-keygen コマンドで、 SSH キー (公開鍵と秘密鍵のペア) を作成します。

ssh-keygen -t rsa -b 4096 -C "[ID]+[GitHub アカウント名]@users.noreply.github.com -f "id_rsa_github_[GitHub アカウント名]"

GitHub ヘルプでは、 -C オプションに GitHub アカウントのメールアドレスを指定していますが、コメントは生成される公開鍵の中にそのまま埋め込まれることになります。

何の公開鍵か確認するのには役立つかもしれませんが、 GitHub アカウントに登録された公開鍵は誰でも取得可能なため、個人的にはメールアドレスを使用するのに抵抗があります。

コメントを空で登録することもできますが、せっかくなので GitHub で提供されている noreply メールアドレスを登録しました。

noreply メールアドレスについては、以下の記事をご参照ください。

ai-can-fly.hateblo.jp

-f オプションで指定する SSH キー名は任意のもので大丈夫ですが、 GitHub アカウント毎に異なる名前にする必要があるので、どのアカウントの SSH キーか判別できる名前にすることをお勧めします。

ssh-keygen コマンド

ssh-keygen [Options]
Options Default Value Description
-t [type] rsa 作成する鍵の暗号化形式
-b [bits] 2048 (rsa の場合) 作成する鍵のビット数
-C [comment] [user]@[host] コメント
-f [identity] id_rsa (rsa の場合) 鍵ファイル名

2). パスフレーズ登録

次にパスフレーズの入力を求められるので、任意の文字列を入力します。

Enter passphrase (empty for no passphrase): [passphrase]

確認のため、再度入力します。

Enter same passphrase again: [passphrase]

パスフレーズは空で登録することもできますが、セキュリティ向上のため、登録することをお勧めします。

3). SSH キー を .ssh ディレクトリへ移動

ssh-keygen コマンドを実行したカレントディレクトリに SSH キー (公開鍵と秘密鍵) が作成されます。

手順通りに実行していれば、以下の SSH キーが作成されているはずです。

Identity File Key Type
id_rsa_github_[GitHub アカウント名].pub 公開鍵
id_rsa_github_[GitHub アカウント名] 秘密鍵

作成された SSH キーを C:\Users\[user_name]\.ssh ディレクトリに移動します。

.ssh ディレクトリが無ければ、新規作成してください。

2. GitHub アカウントに公開鍵を登録

1). GitHub の設定を開く

GitHub にサインインし、 Settings の「SSH and GPG keys」を開きます。

GitHub - Settings - SSH and GPG keys

開いたら、SSH keys の「New SSH Key」ボタンをクリックします。

2). 公開鍵を登録する

GitHub - Settings - Add new SSH Keys

任意の Title を入力し、先程作成した公開鍵をテキストエディタで開いて中身を全てコピーして、 Key テキストエリアへ貼り付けします。

最後に「Add SSH Key」ボタンをクリックして、公開鍵を登録します。

パスワードを求められたら GitHub アカウントのパスワードを入力しましょう。

これで GitHub アカウントへの公開鍵の登録は完了です。

3. GitHub への SSH 接続テスト

1). ssh コマンド実行

ssh コマンドで GitHubSSH 接続できるかテストを行います。

ssh -Ti C:\Users\[user_name]\.ssh\id_rsa_github_[GitHub アカウント名] git@github.com

今回はSSH キー名を GitHub アカウント毎に変えているので、 -i オプションで使用する秘密鍵を指定する必要があることに注意してください。

ssh コマンド

ssh [Options] [user]@[host]
Options Default Value Description
-T None 仮想端末の割り当てを禁止
-i [identity] $HOME/.ssh/id_rsa (Ver.2 の場合) RSA 認証 / DSA 認証の秘密鍵を指定

2). GitHubSSH キーフィンガープリント確認

初めて GitHub サーバに接続する場合、 SSH キーフィンガープリントが表示されるので、正しい値か確認して問題無ければ yes を入力してください。

The authenticity of host 'github.com (52.192.72.89)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?

GitHubSSH キーフィンガープリントは、 GitHub ヘルプに記載されています。

help.github.com

3). パスフレーズ入力

SSH キー作成時にパスフレーズを登録していた場合、 SSH 接続時にパスフレーズの入力を求められるので、登録していたパスフレーズを入力します。

Enter passphrase for key 'C:\Users\[user_name]\.ssh\id_rsa_github_[GitHub アカウント名]': [passphrase]

認証成功のメッセージが表示されれば、 SSH 接続テストは完了です。

Hi [GitHub アカウント名]! You've successfully authenticated, but GitHub does not provide shell access.

これを保持する GitHub アカウント分、繰り返します。

GitHub アカウント毎に SSH 接続を使い分ける

一言で言ってしまえば「 git clone コマンドの引数を変えて使い分けましょう」って話なのですが、管理しやすいように設定ファイルを作ります。

1. OpenSSH SSH クライアント設定ファイル (ssh_config) 作成

まずは、SSH キーを格納している C:\Users\[user_name]\.sshconfig ファイル (拡張子無しでファイル名が config) を作成します。

テキストエディタconfig ファイルを開き、全ての GitHub アカウントの SSH 接続設定を記述しましょう。

HOST github_[GitHub アカウントA]
    HostName github.com
    User git
    IdentityFile C:\Users\[user_name]\.ssh\id_rsa_github_[GitHub アカウントA]
    Port 22
    identitiesOnly yes

HOST github_[GitHub アカウントB]
    HostName github.com
    User git
    IdentityFile C:\Users\[user_name]\.ssh\id_rsa_github_[GitHub アカウントB]
    Port 22
    identitiesOnly yes

... (全ての GitHub アカウント分を記述)

OpenSSH ssh_config (SSH クライアント設定ファイル)

HOST [host_name]
    HostName [host]
    User [user_name]
    IdentityFile [identity_file]
    Port [port]
    IdentitiesOnly [yes or no]
Options Default Value Description
HostName None ホスト名 (IP アドレスも可)
User None ユーザ名
IdentityFile $HOME/.ssh/id_rsa (Ver.2 の場合) RSA 認証 / DSA 認証の秘密鍵
Port 22 リモートホストのポート番号
IdentitiesOnly no ssh_configファイルで構成された認証 ID ファイルのみを使用

2. git clone での SSH 接続の使い分け

GitHubSSH 接続する際に使い分けを意識するのは、主に git clone をする時だと思います。

接続したい GitHub アカウントの SSH クライアント設定を使用して、 git clone コマンドを実行します。

git clone github_[GitHub アカウント名]:[user_name]/[repository_name].git

カレントディレクトリにリポジトリ名のサブディレクトリが作成され、その中に最新のコミットがチェックアウトされます。

3. Git のリモート設定確認

git clone コマンドを実行したら、クローンされたプロジェクトの内容を確認すると共に、プロジェクトディレクトリ内で git remote -v コマンドを実行して Git のリモート設定を確認します。

$ cd ./[repository_name]
$ git remote -v
origin  github_[GitHub アカウント名]:[user_name/[repository_name].git (fetch)
origin  github_[GitHub アカウント名]:[user_name/[repository_name].git (push)

クローンしたリモートリポジトリの設定が表示されれば、正しく SSH 接続できています。

今後はこのプロジェクト内でリモートリポジトリに対して git fetch / git pull / git push を行うことができます。

おわりに

今回は GitHub アカウント毎に SSH 接続を使い分ける方法について書きましたが、リポジトリ毎にユーザを使い分けるということは、ローカルの Git ユーザもリポジトリ毎に使い分ける必要があります。

正しくユーザ設定を行わないと、誤ったユーザ情報でリポジトリにコミットすることになりかねません。

違うクライアントのユーザで、別のクライアントのリポジトリにコミットするとか、絶対あってはならないことです…

同一マシンでリポジトリ毎にユーザを使い分けるための設定については、別記事で紹介しています。

ai-can-fly.hateblo.jp

これでプライベートマシンを使って、複数のプロジェクトの開発が出来ますね!

お仕事のご依頼、お待ちしています!w