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 頭像或姓名,對外顯示的暱稱是系統隨機產生的代號,以保護您的隱私。
登入即表示你同意本站的隱私權政策。