ssh-keychain-unlock
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSSH Keychain Unlock for Claude Code on macOS
macOS上Claude Code的SSH钥匙串解锁方案
Overview
概述
Claude Code stores credentials in the macOS Keychain ( service). When accessing a Mac via SSH (no GUI session), the login keychain is locked, causing Claude Code to appear unauthenticated.
Claude Code-credentialsClaude Code将凭据存储在macOS钥匙串(服务)中。当通过SSH访问Mac(无GUI会话)时,登录钥匙串处于锁定状态,导致Claude Code显示未认证。
Claude Code-credentialsWhen to Use
适用场景
- Claude Code says it's not logged in when accessed via SSH
- shows the keychain is locked
security show-keychain-info ~/Library/Keychains/login.keychain-db - Setting up a Mac Mini or headless Mac for remote Claude Code usage
- 通过SSH访问时Claude Code提示未登录
- 命令显示钥匙串处于锁定状态
security show-keychain-info ~/Library/Keychains/login.keychain-db - 为远程使用Claude Code设置Mac Mini或无头Mac
Solutions
解决方案
Option 1: Interactive Unlock on SSH Login
方案1:SSH登录时交互式解锁
Add to :
~/.zshrcbash
undefined将以下内容添加到:
~/.zshrcbash
undefinedUnlock macOS keychain for SSH sessions (needed for Claude Code auth)
Unlock macOS keychain for SSH sessions (needed for Claude Code auth)
if [[ -n "$SSH_CONNECTION" ]]; then
security unlock-keychain ~/Library/Keychains/login.keychain-db 2>/dev/null
fi
Prompts for macOS login password each SSH session. Simple but requires manual input.if [[ -n "$SSH_CONNECTION" ]]; then
security unlock-keychain ~/Library/Keychains/login.keychain-db 2>/dev/null
fi
每次SSH会话都会提示输入macOS登录密码。操作简单但需要手动输入。Option 2: Auto-Unlock at Boot (Headless)
方案2:开机自动解锁(无头模式)
For fully headless operation with no password prompt:
1. Create password file (, permissions ):
~/.claude/.keychain-password600bash
echo 'YOUR_MACOS_PASSWORD' > ~/.claude/.keychain-password
chmod 600 ~/.claude/.keychain-password2. Create unlock script (, permissions ):
~/.claude/unlock-keychain.sh700bash
cat > ~/.claude/unlock-keychain.sh << 'SCRIPT'
#!/bin/bash
security unlock-keychain -p "$(cat ~/.claude/.keychain-password)" ~/Library/Keychains/login.keychain-db
SCRIPT
chmod 700 ~/.claude/unlock-keychain.sh3. Create LaunchAgent ():
~/Library/LaunchAgents/com.claude.unlock-keychain.plistbash
cat > ~/Library/LaunchAgents/com.claude.unlock-keychain.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.claude.unlock-keychain</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>__HOME__/.claude/unlock-keychain.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
PLIST适用于无需密码提示的完全无头操作:
1. 创建密码文件(,权限设置为):
~/.claude/.keychain-password600bash
echo 'YOUR_MACOS_PASSWORD' > ~/.claude/.keychain-password
chmod 600 ~/.claude/.keychain-password2. 创建解锁脚本(,权限设置为):
~/.claude/unlock-keychain.sh700bash
cat > ~/.claude/unlock-keychain.sh << 'SCRIPT'
#!/bin/bash
security unlock-keychain -p "$(cat ~/.claude/.keychain-password)" ~/Library/Keychains/login.keychain-db
SCRIPT
chmod 700 ~/.claude/unlock-keychain.sh3. 创建LaunchAgent():
~/Library/LaunchAgents/com.claude.unlock-keychain.plistbash
cat > ~/Library/LaunchAgents/com.claude.unlock-keychain.plist << 'PLIST'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.claude.unlock-keychain</string>
<key>ProgramArguments</key>
<array>
<string>/bin/bash</string>
<string>__HOME__/.claude/unlock-keychain.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
PLISTFix path
Fix path
sed -i '' "s|HOME|$HOME|g" ~/Library/LaunchAgents/com.claude.unlock-keychain.plist
**4. Load the agent:**
```bash
launchctl load ~/Library/LaunchAgents/com.claude.unlock-keychain.plistsed -i '' "s|HOME|$HOME|g" ~/Library/LaunchAgents/com.claude.unlock-keychain.plist
**4. 加载Agent:**
```bash
launchctl load ~/Library/LaunchAgents/com.claude.unlock-keychain.plistQuick Reference
快速参考
| Command | Purpose |
|---|---|
| Check keychain lock status |
| Manually unlock (interactive) |
| Test auto-unlock script |
| Load LaunchAgent |
| Unload LaunchAgent |
| 命令 | 用途 |
|---|---|
| 检查钥匙串锁定状态 |
| 手动解锁(交互式) |
| 测试自动解锁脚本 |
| 加载LaunchAgent |
| 卸载LaunchAgent |
Common Mistakes
常见错误
- Wrong permissions on password file - Must be (owner-only). Others can read your macOS password otherwise.
600 - Forgetting to load the LaunchAgent - Creating the plist isn't enough; run to activate it.
launchctl load - Password file out of sync - If you change your macOS password, update too.
~/.claude/.keychain-password
- 密码文件权限错误 - 必须设置为(仅所有者可访问),否则其他人可能读取你的macOS密码。
600 - 忘记加载LaunchAgent - 仅创建plist文件不够,需运行命令激活它。
launchctl load - 密码文件不同步 - 如果你修改了macOS密码,也要更新文件。
~/.claude/.keychain-password