Claude CodeでSSH_AUTH_SOCKが見えずgit pushできない問題の解決
問題
Claude Codeのシェルから git push すると Permission denied (publickey) で失敗する。
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.
tmux経由で起動していた時は問題なかったが、tmuxなしで起動すると再現する。
原因
2つの原因が重なっていた。
1. Claude Codeのシェルはnon-interactive
Claude Codeが起動するシェルは non-interactive login shell であるため、~/.zshrc は読み込まれない。
zshの読み込み順:
1. .zshenv ← 常に読まれる
2. .zprofile ← login shellで読まれる
3. .zshrc ← interactive shellでのみ ★Claude Codeでは読まれない
4. .zlogin ← login shellで読まれる
2. SSH_AUTH_SOCKが一時パスを指している
macOSの launchd が管理する ssh-agent のソケットは /private/tmp/com.apple.launchd.xxx/Listeners のような一時パスに作られる。このパスはエージェントの再起動やマシン再起動で変わるため、シェル起動時に設定された SSH_AUTH_SOCK が後から無効になる。
tmuxで動いていたのは、たまたまセッション内でソケットが有効だっただけ。
Claude Code側の既知バグ
CC_ENV_EXTRACT_LIST に SSH_AUTH_SOCK が含まれておらず、サンドボックス内からソケットにアクセスできない問題が報告されている。
解決策
1. ssh-agentのソケットパスを固定する
~/.zshenv.local(.zshenv から読み込まれるファイル)に以下を追加:
# SSH agent(固定ソケット)
export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock"
if ! ssh-add -l &>/dev/null 2>&1; then
rm -f "$SSH_AUTH_SOCK"
eval "$(ssh-agent -a "$SSH_AUTH_SOCK")" >/dev/null 2>&1
ssh-add --apple-use-keychain ~/.ssh/id_ed25519 2>/dev/null
fi
ポイント:
- ソケットパスが常に
~/.ssh/agent.sockで固定 - エージェントが死んでいたら自動再起動 + Keychain連携で鍵登録
.zshenvに書くことでnon-interactive shellでも有効
2. Claude Codeの設定にソケットパスを渡す
~/.claude/settings.json に env を追加:
{
"env": {
"SSH_AUTH_SOCK": "~/.ssh/agent.sock"
}
}
検証
Claude Codeを再起動後、以下を確認:
# 鍵が読まれているか
ssh-add -l
# → 256 SHA256:xxx user@example.com (ED25519)
# GitHubに繋がるか
ssh -T git@github.com
# → Hi username! You've successfully authenticated...
# pushできるか
git push
# → Everything up-to-date
まとめ
| 対策 | 目的 |
|---|---|
.zshenv でソケット固定 |
どのシェルからでも同じパスでエージェントに接続 |
settings.json の env |
Claude Codeのサンドボックスにソケットパスを渡す |
--apple-use-keychain |
macOS Keychainからパスフレーズを自動取得 |