複数のGithubにSSH公開鍵認証でpushしたい
背景
仕事寄りとプライベート寄りとか、別のグループ向けに別途アカウントを用意したりなど、複数のGithubアカウントを使い分けたい方が、少なからずいると思います。
httpsで扱う方法も手段としてはありますが、pushの際にパスワードを入力したりと面倒です。
一方、公開鍵はアカウントの主を担保するものであり、一意である必要があると思われるので、片方のアカウントに登録した公開鍵をもう一方のアカウントに登録することはできません。(登録しようとするとエラーになるはずです)
となると
アカウントAの公開鍵・秘密鍵のセットとアカウントBの公開鍵・秘密鍵のセットを用意することになります。
例えば、リモートサーバーにSSHログインする場合には、下記のように秘密鍵を指定して使い分けることができますよね。
ssh IPアドレス -i ~/.ssh/id_rsa
git pushする際に、これと似たようなことをするにはどうすれば良いのか。
GIT_SSH_COMMANDを使う
GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa_supilog' git push origin main
と鍵を指定することができます。これが利用できるのは、gitのバージョンが2.3からのようです。
どうしてもバージョンを上げられない場合は、次に紹介するGIT_SSH
を利用する方法があります。
GIT_SSHを使う
# git-ssh.shファイルを作成
$ vi /tmp/git-ssh.sh
---------
#!/bin/sh
exec ssh -i ~/.ssh/id_rsa_supilog "$@"
---------
# 実行権限
$ chmod 744 /tmp/git-ssh.sh
GIT_SSH=/tmp/git-ssh.sh git push origin main
これでpushすることができます。
~/.ssh/configを使う
上にあげた2つの方法は個人的には好みではありません。普通にgitコマンドが打てないからです。GIT_SSHにおいては、アカウント毎にシェルを作成するなんて・・・不本意ですw
ということで、~/.ssh/configを修正することに抵抗がなければ、おすすめです。(configは修正したくないという方もおられますので、そこはおまかせです)
Host github.com.private
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_rsa_private
TCPKeepAlive yes
IdentitiesOnly yes
Host github.com.supilog
HostName github.com
User git
Port 22
IdentityFile ~/.ssh/id_rsa_supilog
TCPKeepAlive yes
IdentitiesOnly yes
このように、~/.ssh/configに使用したい秘密鍵を指定してかき分けておきます。
Hostで記載した「github.com.private」「github.com.supilog」を使い分けることで、問題を解決します。
新規にリポジトリを作成する場合
新規にリポジトリを作成する場合、概ね以下のような作業を行うと思います。
echo "# git_test" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:supilog/git_test.git
git push -u origin main
問題となるのは、remote add の部分ですが、このままではせっかくconfigに記述した意味がありませんので、ホストの部分を書き換えます。
# git@github.com ---> git@github.com.supilog (~/.ssh/configで設定したHost)
git remote add origin git@github.com.supilog:supilog/git_test.git
こうすることで、設定上はgithub.comにアクセスされますし、指定したSSH秘密鍵が使用されるので、今後はpushの度に鍵を指定する必要はないです。
既存リポジトリをcloneして作業する場合
新規の場合には、remoteの接続先として自分の指定したいホストを設定しました。一方、既存リポジトリをcloneする場合には、clone時に指定してしまえば問題ありません。
git clone git@github.com.supilog:supilog/git_test.git
clone済みの既存リポジトリに対して接続ホストを変更したい場合
すでにclone済みのリポジトリに関しては、リモートURLのホストが「github.com」になってしまっていると思います。このままでは指定したい秘密鍵は当然ながら適用されません。
いやcloneし直してよ。と思っちゃいますが、環境構築などの問題で絶対やりたくない場合は、変更する手はあります。
# 現在のリモートURLを確認
git remote -v
-----
origin git@github.com:supilog/git_test.git (fetch)
origin git@github.com:supilog/git_test.git (push)
-----
# 新しいリモートURLに変更
git remote set-url origin git@github.com.supilog:supilog/git_test.git
# 変更後のリモートURLを確認
git remote -v
-----
origin git@github.com.supilog:supilog/git_test.git (fetch)
origin git@github.com.supilog:supilog/git_test.git (push)
-----
まとめ
どの手段をとるにせよ、gitリポジトリの操作は危険がつきまといますので、大事なリポジトリであればあるほど、テスト用のリポジトリなどで十分にテストを実施した上で、作業を行ってください!