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の認証には影響を与えません(一敗)
コメント