Git 可以 push,Claude Code 却读不到 GitHub Issues:SSH 与 GitHub API 权限的区别
Claude Code GitHub Issues 读不到,但 git push 正常?SSH key 只授权 Git 传输,Issues 和 PR 要另外的 API 认证。用 gh CLI 登录、确认权限、保护 token,并把 Issue 串成 PR 流程。
本文目录
我在 2026 年 10 月把 Claude Code 搭在 Oracle 主机上,GitHub 的 SSH key 设置好了,git fetch、git push 都正常。但让 Claude Code 去读一个 GitHub Issue 时,它报告缺少 GitHub API 认证:主机上没有 gh CLI,也没有 GH_TOKEN 或 GITHUB_TOKEN。
先说结论:SSH key 只授权 Git 的传输,要让 Claude Code 读得到 GitHub Issues 和 PR,需要另外的 GitHub API 认证。 最直接的做法是在主机上安装 GitHub CLI(gh),用实际运行 Claude Code 的那个 Linux 用户登录,再用 gh auth status、gh issue list 确认。登录前先想好权限给多大、token 存在哪里。
本文是我 2026 年 10 月在 Ubuntu 24.04 主机上的配置记录。命令中的
project-a、ORG/REPO都是示例,请换成自己的用户和有权限的 repo。GitHub CLI 的参数和行为以 cli.github.com 官方说明为准(2026 年 10 月 12 日查阅)。
Claude Code GitHub Issues 读不到的原因:SSH 和 API 是两套权限
GitHub 有两套不同的访问方式:
| 想做的事 | 用什么验证 | 典型命令 |
|---|---|---|
| 下载、推送代码 | GitHub SSH key(个人 SSH key 或 repo 的 deploy key) | git fetch、git push |
| 读写 Issues、PR、CI 状态 | GitHub API 认证(GitHub CLI 登录或 token) | gh issue view、gh pr list |
SSH key 让 Git 能和 GitHub 交换 commit,但 Issues、PR、评论这些数据要走 GitHub 的 API。Claude Code 要读 Issue,通常会用 gh 或带 token 调用 API;两者都没有,它就读不到,即使 git push 一切正常。
安装 gh,用运行 Claude Code 的 Linux 用户登录
安装 GitHub CLI
在管理员账号下安装:
sudo apt update && sudo apt install -y gh
gh --version
安装方式和版本以 GitHub CLI 官方安装说明为准。
用正确的用户执行 gh auth login
登录要在实际运行 Claude Code 的 Linux 用户下进行。如果 Claude Code 跑在 project-a 这个用户下,在管理员账号登录 gh 对它没有用。
sudo -iu project-a
gh auth login --hostname github.com --git-protocol ssh --web --skip-ssh-key
| 参数 | 作用 |
|---|---|
--hostname github.com |
登录 github.com |
--git-protocol ssh |
Git 操作使用 SSH。官方说明这个设置会应用到 github.com 下登录的所有账号 |
--web |
用浏览器授权。主机没有桌面时,界面会给出一组一次性代码,在自己的电脑或手机浏览器打开 GitHub 页面输入 |
--skip-ssh-key |
跳过“生成并上传 SSH key”的提示。主机已经有可用的 GitHub SSH key 时加上 |
确认登录成功、读得到 Issues
gh auth status
gh issue list --repo ORG/REPO --limit 5
gh issue view 70 --repo ORG/REPO
gh auth status 会显示登录的账号和 token 的存储位置(官方说明)。能列出 Issue,Claude Code 在同一个用户下也就能用 gh 读了。
token 存在哪:没有桌面的 Linux 要注意
GitHub CLI 官方说明,gh 默认把 token 存在系统的凭据存储区;找不到或无法使用凭据存储区时,会改为写进纯文本文件。在没有桌面环境的 Linux 主机上,很可能就是这种情况。
所以要做几件事:
- 用
gh auth status确认 token 存在哪里。 - 保护
~/.config/gh/的文件权限,只让这个 Linux 用户能读。 - 不同项目、不同信任程度的工作,分给不同的 Linux 用户,避免一个用户的 token 被其他项目读到。
- 不要为了贴日志执行
gh auth token或gh auth status --show-token,输出会直接显示 token。 - 不要把
~/.config/gh/、~/.ssh/上传到任何公开的地方,也不要放进 repo。
权限给多少:最小权限的选择
gh auth login 用的是你个人 GitHub 账号的授权,范围可能比单个 repo 需要的更广。如果这台主机只需要读写某一个 repo 的 Issues 和 PR,可以考虑更窄的方式:
| 方式 | 权限范围 | 适合 |
|---|---|---|
gh auth login(个人账号授权) |
视授权范围而定,可能涵盖你能访问的许多 repo | 个人项目、自己完全掌控的主机 |
| Fine-grained personal access token | 可以只选特定 repo,只开 Issues、Pull requests 等需要的权限 | 想限制在少数 repo |
| GitHub App | 安装在指定 repo,权限在 App 设置里管控 | 团队、长期自动化 |
GitHub CLI 官方说明提到,用 --with-token 传入 fine-grained token 可能出现令人困惑的行为,建议改用 GH_TOKEN 环境变量。不管用哪种方式,token 都不要写进 repo、CLAUDE.md、systemd 的 unit 文件、文章或截图里,也不要贴到对话里请别人帮忙看。
用 –spawn=worktree 时也要确认
如果 Claude Code Remote Control 用 --spawn=worktree 模式,每个新 session 会在自己的 Git worktree 里工作。worktree 换了目录,但运行的 Linux 用户没变,所以 gh 的登录状态一样适用。开工前还是值得确认:
- 这个 session 跑在预期的 Linux 用户下。
gh在 PATH 里(用 systemd 启动时,PATH由 unit 文件设置)。- 这个用户的授权读得到目标 repo。
多个 Remote Control 和 worktree 怎么分工,见《一台主机运行多个 Claude Code Remote Control》。
从 Issue 到 PR:把任务串起来
gh 能用之后,GitHub Issues 就可以当成给 Claude Code 的任务清单:在 Issue 里写清楚要做什么,Claude Code 读 Issue、在分支上修改、开 PR,你在 PR 上审。
# 只读取,不改动 Issue
gh issue list --repo ORG/REPO --state open --limit 20
gh issue view 70 --repo ORG/REPO --comments
# 看 PR 和 CI 状态
gh pr list --repo ORG/REPO
gh pr checks 123 --repo ORG/REPO
几个要注意的地方:
- commit 到 feature 分支不等于已经上线,要确认 PR 合并、CI 通过、部署完成。
- 开 PR 前确认当前分支、base 分支和 diff,
--spawn=worktree的 session 可能不在你以为的分支上。 - 读 Issue 和改 Issue 是不同的权限。只需要读,就只给读。
整套主机和 Remote Control 的配置,见《Oracle Cloud 搭建 Claude Code Remote Control 常驻教程》;网站整体怎么用 GitHub 管理文章和部署,见《Jason Finance 从零到一》。
常见问题
为什么 git push 可以,Claude Code 却读不到 GitHub Issues?
因为两者是不同的权限机制。SSH key 只授权 Git 的传输,例如 git fetch 和 git push;Issues 和 PR 要通过 GitHub API 读取,需要 GitHub CLI 登录或 API token。SSH key 设置好了,不代表 API 也能用。
怎么让 Claude Code 读得到 GitHub Issues?
在主机上安装 gh,切换到实际运行 Claude Code 的 Linux 用户,执行 gh auth login --hostname github.com --git-protocol ssh --web --skip-ssh-key 完成授权,再用 gh auth status 和 gh issue list 确认。
gh auth login 的 --skip-ssh-key 是做什么的?
用 SSH 作为 Git 协议时,gh 会检测密钥并询问是否生成、上传新的 SSH key。主机已经有可用的 GitHub SSH key 时,加上 --skip-ssh-key 就会跳过这一步。
gh 的 token 存在哪里?安全吗?
gh 默认存在系统的凭据存储区;找不到或无法使用时,会改存成纯文本文件。在没有桌面环境的 Linux 主机上要特别注意文件权限,gh auth status 会显示 token 存在哪里。
用个人账号登录 gh 权限会不会太大?
可能会。gh auth login 的个人授权范围可能比单个 repo 需要的更广。要做到最小权限,可以评估只开放特定 repo 与 Issues、PR 权限的 fine-grained token 或 GitHub App。
可以把 GitHub token 写进 CLAUDE.md 或 systemd 配置吗?
不要。token 不应出现在 repo、CLAUDE.md、systemd unit 文件、shell 历史记录、日志或公开截图里;也不要为了贴日志执行 gh auth token 或 gh auth status --show-token。
延伸阅读
- 看不懂代码也能建网站:我用 Claude Code + GitHub + Cloudflare 低成本搭建 Jason Finance 的方法与成本我看不懂代码,Jason Finance 是用 Claude Code、GitHub、Cloudflare Workers 和 Supabase 免费方案搭起来的。整理整套架构、每个服务的用途与费用、我怎么给 AI 权限,以及这种做法的限制。
- 一台主机运行多个 Claude Code Remote Control:Linux user、systemd 与 git worktree 分工Claude Code 多个 Remote Control 运行在同一台主机:信任边界不同就分 Linux user,每个环境一个 systemd service,同一个 repo 的开发和写文章用 git worktree 分开,并说明 --spawn=worktree 的限制。
- 看不懂 SSH 也能维护 WordPress:Jason Career 用 Claude Code、SSH 与 WP-CLI 管理网站的实际记录Jason Career 是有 65 个插件、电商和课程的 WordPress 网站。我看不懂 SSH 和程序,改用 Claude Code 通过 SSH 与 WP-CLI 维护:10 天内做了哪些事、遇到哪些问题,以及我怎么限制 AI 在正式网站上的权限。

留言
使用 Google 登录即可留言。留言“不会”使用您的 Google 头像或姓名,对外显示的昵称是系统随机生成的代号,以保护您的隐私。
登录即表示你同意本站的隐私政策。