Windows + WSL で GitHub 複数アカウントを SSH で使い分ける方法
はじめに
1台のPCで、仕事用と個人用など複数のGitHubアカウントを使い分けたい場面は多いと思います。しかし、SSH鍵やconfig
ファイルの設定は複雑で、つまずきやすいポイントでもあります。
特に、WindowsとWSL (Windows Subsystem for Linux) の両方から、同じようにアカウントを切り替えて使いたい場合、設定が二度手間になったり、パスの指定で混乱しがちです。
この記事では、WindowsとWSLの両方で、複数のGitHubアカウントをSSH接続で安全かつ快適に使い分けるための手順を、網羅的に解説します。最終的に「git push
時にパスフレーズの入力が不要で、かつリポジトリごとに正しいアカウント情報でコミットできる」状態を目指します。
この記事で実現すること
- WindowsとWSLでSSH鍵を共有し、設定を共通化する
-
~/.ssh/config
ファイルを使って、アカウントごとの接続設定を管理する -
ssh-agent
を利用して、ターミナル起動後のパスフレーズ入力を省略する - リポジトリごとに
user.name
とuser.email
を正しく設定し、コミットユーザーの間違いを防ぐ
手順一覧
- SSH鍵の作成 (Windows)
- GitHubへの公開鍵の登録
- SSH configの設定 (Windows)
- WSLへのSSH鍵とconfigのコピー
- WSL側のパーミッション(権限)設定
ssh-agent
でパスフレーズ入力を省略 (Windows & WSL)- リポジトリごとにコミットユーザーを設定
- 接続テストと
git push
1. SSH鍵の作成 (Windows)
まず、アカウントごとにSSH鍵を作成します。Windows標準のPowerShellを開いて作業しましょう。
ここでは例として、main-account
(メイン)とsub-account
(サブ)の2つのアカウント用の鍵を作成します。
# 鍵を保存する .ssh ディレクトリがなければ作成
# 'YourUser' の部分はご自身のWindowsユーザー名に置き換えてください
mkdir C:\Users\YourUser\.ssh
# 1. メインアカウント用の鍵を作成
ssh-keygen -t [algorithm] -C "main-account@example.com" -f C:\Users\YourUser\.ssh\id_[algorithm]_main
# 2. サブアカウント用の鍵を作成
ssh-keygen -t [algorithm] -C "sub-account@example.com" -f C:\Users\YourUser\.ssh\id_[algorithm]_sub
-
-t [algorithm]
:安全性の高い暗号化アルゴリズムを指定しています。 -
-C "your-email@example.com"
:コメントとしてメールアドレスを記載します。どの鍵がどのアカウント用か識別するために便利です。 -
-f C:\Users\YourUser\.ssh\id_[algorithm]_xxx
:鍵のファイル名を指定します。デフォルト名だと上書きされてしまうため、アカウントごとに必ず違うファイル名を指定してください。
実行するとパスフレーズの入力を求められます。設定しておくとセキュリティが向上します(後述のssh-agent
で入力は省略できます)。
この時点で、.ssh
フォルダには4つのファイルが作成されます。
-
id_[algorithm]_main
(秘密鍵) -
id_[algorithm]_main.pub
(公開鍵) -
id_[algorithm]_sub
(秘密鍵) -
id_[algorithm]_sub.pub
(公開鍵)
2. GitHubへの公開鍵の登録
次に、作成した公開鍵 (.pub
ファイル) の中身をコピーして、それぞれのGitHubアカウントに登録します。
PowerShellで公開鍵の内容を表示し、コピーします。
# メインアカウントの公開鍵を表示
cat C:\Users\YourUser\.ssh\id_[algorithm]_main.pub
# サブアカウントの公開鍵を表示
cat C:\Users\YourUser\.ssh\id_[algorithm]_sub.pub
表示された ssh-[algorithm] ...
から始まる文字列をすべてコピーし、対応するGitHubアカウントの Settings > SSH and GPG keys > New SSH key から登録します。
3. SSH configの設定 (Windows)
C:\Users\YourUser\.ssh\
に config
という名前のファイル(拡張子なし)を作成し、以下のように編集します。
このファイルで、どのホスト名(エイリアス)にどの秘密鍵を使うかを定義します。
# メインアカウント (main-account)
Host github.com-main
HostName github.com
User git
IdentityFile C:\Users\YourUser\.ssh\id_[algorithm]_main
IdentitiesOnly yes
# サブアカウント (sub-account)
Host github.com-sub
HostName github.com
User git
IdentityFile C:\Users\YourUser\.ssh\id_[algorithm]_sub
IdentitiesOnly yes
-
Host github.com-main
:SSH接続時に使う**エイリアス(別名)**です。この名前で接続先を切り替えます。github.com-
のように接頭辞をつけると分かりやすいです。 -
HostName github.com
:実際の接続先ホスト名です。 -
IdentityFile
:使用する秘密鍵のパスを指定します。 -
IdentitiesOnly yes
:指定した鍵のみで認証を試みる設定です。意図しない鍵が使われるのを防ぎます。
4. WSLへのSSH鍵とconfigのコピー
Windowsで作成した鍵とconfigファイルを、WSLのホームディレクトリにある.ssh
フォルダにコピーします。これで設定を共有できます。
WSLのターミナルを開いて、以下のコマンドを実行します。
# WSL側に .ssh ディレクトリがなければ作成
mkdir -p ~/.ssh
# Windowsの鍵ファイルとconfigファイルをWSLにコピー
# 'YourUser' の部分はご自身のWindowsユーザー名に置き換えてください
cp /mnt/c/Users/YourUser/.ssh/id_[algorithm]* ~/.ssh/
cp /mnt/c/Users/YourUser/.ssh/config ~/.ssh/
次に、WSLのconfigファイル内のパスを、Windows形式 (C:\Users\...
) からLinux形式 (~/.ssh/...
) に修正します。
# WSLのconfigファイルを開いて編集
code ~/.ssh/config # VSCodeで開く場合
# nano ~/.ssh/config # nanoで開く場合
以下のようにパスを書き換えます。
# メインアカウント (main-account)
Host github.com-main
HostName github.com
User git
IdentityFile ~/.ssh/id_[algorithm]_main
IdentitiesOnly yes
# サブアカウント (sub-account)
Host github.com-sub
HostName github.com
User git
IdentityFile ~/.ssh/id_[algorithm]_sub
IdentitiesOnly yes
5. WSL側のパーミッション(権限)設定
Linux (WSL) では、SSH関連ファイルのパーミッションが厳格にチェックされます。安全でない権限設定になっていると、SSH接続が拒否されてしまいます。
以下のコマンドで正しい権限を設定します。
# 秘密鍵とconfigファイルは所有者のみ読み書き可能に (600)
chmod 600 ~/.ssh/id_[algorithm]_main ~/.ssh/id_[algorithm]_sub ~/.ssh/config
# 公開鍵は他人が読んでもOK (644)
chmod 644 ~/.ssh/id_[algorithm]_main.pub ~/.ssh/id_[algorithm]_sub.pub
ls -l ~/.ssh
で確認し、以下のような表示になっていればOKです。
- 秘密鍵 (
id_[algorithm]_...
):-rw-------
- 公開鍵 (
.pub
):-rw-r--r--
-
config
:-rw-------
6. ssh-agentでパスフレーズ入力を省略
このままでは、git push
などのSSH通信のたびに鍵のパスフレーズを求められてしまいます。ssh-agent
に鍵を登録することで、ターミナルセッション中はパスフレーズの入力を省略できます。
Windows (PowerShell)
ssh-agent
サービスを起動し、鍵を登録します。
# ssh-agentサービスを開始
Start-Service ssh-agent
# サービスが自動起動するように設定(PC再起動後も有効)
Set-Service -Name ssh-agent -StartupType Automatic
# 鍵をssh-agentに登録
ssh-add C:\Users\YourUser\.ssh\id_[algorithm]_main
ssh-add C:\Users\YourUser\.ssh\id_[algorithm]_sub
# 登録された鍵を確認
ssh-add -l
WSL (Bash / Zsh)
WSLではターミナルを起動するたびにssh-agent
を起動し、鍵を登録する必要があります。これを自動化するため、シェルの設定ファイル (.bashrc
や.zshrc
) にスクリプトを追記するのが便利です。
まずは手動で実行してみましょう。
# ssh-agentを起動
eval "$(ssh-agent -s)"
# 鍵をssh-agentに登録
ssh-add ~/.ssh/id_[algorithm]_main
ssh-add ~/.ssh/id_[algorithm]_sub
# 登録された鍵を確認
ssh-add -l
7. リポジトリごとにコミットユーザーを設定
SSHの接続設定とは別に、どのユーザーとしてコミットするかという設定が必要です。これを怠ると、意図しないアカウントでコミットしてしまう事故が起こります。
各リポジトリのディレクトリ内で、--local
オプションを付けて設定します。
# main-accountのリポジトリに移動
cd path/to/main-repo
# main-accountのユーザー名とメールアドレスを設定
git config --local user.name "Your Main Account Name"
git config --local user.email "main-account@example.com"
# ---
# sub-accountのリポジトリに移動
cd path/to/sub-repo
# sub-accountのユーザー名とメールアドレスを設定
git config --local user.name "Your Sub Account Name"
git config --local user.email "sub-account@example.com"
この設定は、そのリポジトリ内でのみ有効になります。
8. 接続テストとgit push
最後に、設定が正しくできたか確認しましょう。
接続テスト
ssh -T
コマンドで、各アカウントのエイリアスに接続できるかテストします。
# Windows / WSL どちらでもOK
# メインアカウントのテスト
ssh -T git@github.com-main
# Hi main-account-username! You've successfully authenticated... と返ってくれば成功
# サブアカウントのテスト
ssh -T git@github.com-sub
# Hi sub-account-username! You've successfully authenticated... と返ってくれば成功
git remoteのURLを設定してpush
リポジトリのリモートURLを、configで設定したエイリアスを使う形に変更します。
git@github.com:
の部分をgit@github.com-main:
のように書き換えるのがポイントです。
# 既存のリポジトリの場合
git remote set-url origin git@github.com-main:main-account-username/your-repo.git
# 新しくクローンする場合
git clone git@github.com-sub:sub-account-username/another-repo.git
設定が完了したら、通常通りgit push
を実行します。パスフレーズが聞かれなければ成功です。
git push -u origin main
まとめ
これで、WindowsとWSLの両方から、複数のGitHubアカウントをシームレスに使い分ける環境が整いました。
-
~/.ssh/config
で接続情報を一元管理する -
ssh-agent
でパスフレーズ入力を省略して快適にする -
git config --local
でリポジトリごとにコミットユーザーを明示する
これらの設定を組み合わせることで、アカウントの切り替えミスを防ぎ、安全で効率的な開発が行えるようになります。
よくあるエラーと対処法
Permission denied (publickey).
- GitHubに公開鍵が正しく登録されているか確認してください。
-
~/.ssh/config
のIdentityFile
のパスが間違っていないか確認してください。 - WSLでファイルのパーミッションが正しいか (
chmod 600
) 確認してください。
Bad owner or permissions on ~/.ssh/config
WSLで~/.ssh/config
または秘密鍵のパーミッションが緩すぎます。chmod 600
を実行してください。
Agent admitted failure to sign using the key.
ssh-agent
に鍵が登録されていません。ssh-add
コマンドを実行してください。ターミナルを再起動した場合は、再度eval "$(ssh-agent -s)"
とssh-add
が必要です。
Discussion