🙄

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.nameuser.emailを正しく設定し、コミットユーザーの間違いを防ぐ

手順一覧

  1. SSH鍵の作成 (Windows)
  2. GitHubへの公開鍵の登録
  3. SSH configの設定 (Windows)
  4. WSLへのSSH鍵とconfigのコピー
  5. WSL側のパーミッション(権限)設定
  6. ssh-agentでパスフレーズ入力を省略 (Windows & WSL)
  7. リポジトリごとにコミットユーザーを設定
  8. 接続テストと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/configIdentityFileのパスが間違っていないか確認してください。
  • 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