一台のPCで複数のgithubアカウントを利用する際のssh設定

githubへ接続する際のssh設定で詰まったので書き留めておきます

想定する環境:
– 複数のgithubアカウントを持っている
– それぞれ、ssh公開鍵はアップロード済み

結論

~/.ssh/configの各ホストでIdentitiesOnlyをyesにします
↓例

Host github.personal
	AddKeysToAgent yes
	UseKeychain yes # macのkeychainを使ってpass phraseを入力できる
	Hostname ssh.github.com
	IdentityFile ~/.ssh/personal
	TCPKeepAlive yes 
	IdentitiesOnly yes # こいつが必要
	Port 443 # port 22が許可されてない時用
	User git

Host github.work
	AddKeysToAgent yes
	UseKeychain yes
	Hostname ssh.github.com
	IdentityFile ~/.ssh/work
	TCPKeepAlive yes
	IdentitiesOnly yes
	Port 443
	User git

困っていた事

以下おまけです

今の現場で支給されているPCに自分のdotfileを持ってくる為個人のgithubアカウントと接続するためのssh設定を済ませていたのですが、新たに会社用のアカウントも必要になったのでそちらの方の接続設定も行なった所、常に僕個人のアカウントの設定でssh接続される様になりました。仕事の開発を行うレポジトリでは仕事用のアカウントで認証して欲しいのですが、勝手に個人用のアカウントとして接続しようとしていた為当然pullやpushに失敗してしまいます

原因究明

そもそも何故常に個人用のアカウントで認証されている事がわかったのか、ですがコマンドライン上でssh -T <ホスト>とすると、

Hi sugiura-hiromiti! You've successfully authenticated, but GitHub does not provide shell access.

この様な出力がされます。ここで、<ホスト>の部分はssh設定のHostの項目で設定している文字列になります。自分の場合は個人用のアカウントにgithub.personal、仕事用のアカウントにgithub.workの名前をつけているのですが、ssh -T github.personalとした場合もssh -T github.flectとした場合も同様に上記の出力がされてしまっていました

sshに-vオプションを指定してやると詳細なログを出力できるので、ssh -vT github.workを実行してみたところ、ローカルにある個人用の秘密鍵を使っている事がわかりました(怖いので念の為コマンドの出力は載せないでおきます..)。どうやらIdentitiesOnlyオプションがnoになっているとIdentityFileで指定した鍵以外も認証の際に使われるそうです。このオプションはデフォルトでnoになっている様なので設定でyesにする記述を追加すれば解決!となります

.gitconfig

更に余談です。
ネットの情報を見ると「.gitconfigの設定をする事で、githubアカウントを自動で切り替える事ができる」という言説がちらほらありますが、これは少し間違っています。.gitconfigはgitの設定をするものであり、githubの設定はできません。githubのアカウントを自動で切り替える事ができると解説している記事では、IncludeIfの記述を追加することで、特定のレポジトリでユーザー名とメールアドレスを切り替える事ができるとありますが、これで切り替わるのはコミット時のユーザー名とメールアドレスです。

今回やりたかったのは「githubのアカウントを切り替えたい」だったので.gitconfigを設定したとしてもgithubの認証には影響を与えません(一敗)

杉浦 寛行

 杉浦 寛行

スキル:Rust/Lua/Java/C/C++/Lisp/TypeScript/WebAssembly/Assembly/osdev/Neovm/nix/AWS/Linux

コメント

この記事へのコメントはありません。

関連記事