問題

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_LISTSSH_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.jsonenv を追加:

{
  "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.jsonenv Claude Codeのサンドボックスにソケットパスを渡す
--apple-use-keychain macOS Keychainからパスフレーズを自動取得