<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>工具 on Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/categories/%E5%B7%A5%E5%85%B7/</link>
        <description>Recent content in 工具 on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jiangwan.ink/categories/%E5%B7%A5%E5%85%B7/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>解决 Windows 环境下 Git SSH Permission denied 报错</title>
        <link>https://jiangwan.ink/p/git-windows-ssh-permission-denied/</link>
        <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://jiangwan.ink/p/git-windows-ssh-permission-denied/</guid>
        <description>&lt;h2 id=&#34;一现象描述&#34;&gt;一、现象描述
&lt;/h2&gt;&lt;p&gt;在 Windows 环境下配置 GitHub SSH 密钥时，常常会遇到一个充满迷惑性的报错现象。当我们在终端直接测试 SSH 连接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;终端会正常返回欢迎信息，证明密钥配置无误：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hi your_username! You&amp;#39;ve successfully authenticated...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但紧接着执行 &lt;code&gt;git clone&lt;/code&gt; 或 &lt;code&gt;git push&lt;/code&gt; 命令时，却直接报错拒绝访问：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git@github.com: Permission denied (publickey).
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fatal: Could not read from remote repository.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;二问题排查&#34;&gt;二、问题排查
&lt;/h2&gt;&lt;p&gt;现象表现为同一台电脑对同一份密钥的读取结果前后矛盾。为了确认 Git 在执行网络请求时到底发生了什么，我们可以开启 Git 的 SSH 调试模式。在终端临时注入环境变量，强制输出 Git 底层的 SSH 调用日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh -v&amp;#34;&lt;/span&gt; git clone git@github.com:your-name/your-repo.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过详细日志可以观察到，&lt;code&gt;git clone&lt;/code&gt; 并没有调用系统默认的 SSH 程序，也没有去正确的 &lt;code&gt;~/.ssh&lt;/code&gt; 目录下寻找刚刚配置好的私钥。&lt;/p&gt;
&lt;h2 id=&#34;三原因分析&#34;&gt;三、原因分析
&lt;/h2&gt;&lt;p&gt;这个问题的核心在于：Windows 系统中同时存在两个互不相通的 SSH 程序。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  graph TD
    A[终端环境] --&amp;gt; B{执行指令}
    B --&amp;gt;|ssh -T| C[Windows 原生 OpenSSH]
    B --&amp;gt;|git clone| D[Git 自带内部 SSH]
    
    C --&amp;gt;|读取 C:\Users\用户名\.ssh| E[找到私钥]
    E --&amp;gt; F[连接 GitHub 成功]
    
    D --&amp;gt;|MSYS2 模拟环境| G[路径解析偏差 / 无法读取 ssh-agent]
    G --&amp;gt; H[找不到私钥]
    H --&amp;gt; I[Permission denied]
&lt;/pre&gt;

&lt;h3 id=&#34;1-windows-原生-openssh&#34;&gt;1. Windows 原生 OpenSSH
&lt;/h3&gt;&lt;p&gt;从 Windows 10 开始，微软内置了一套原生的 OpenSSH 工具，路径为 &lt;code&gt;C:\Windows\System32\OpenSSH\ssh.exe&lt;/code&gt;。执行 &lt;code&gt;ssh -T&lt;/code&gt; 时，系统默认唤醒的是这个原生程序。它能准确识别当前 Windows 用户的 &lt;code&gt;~/.ssh&lt;/code&gt; 目录并读取私钥，因此测试顺利通过。&lt;/p&gt;
&lt;h3 id=&#34;2-git-for-windows-自带-ssh&#34;&gt;2. Git for Windows 自带 SSH
&lt;/h3&gt;&lt;p&gt;安装 Git 时，为了兼容旧版 Windows，Git 官方打包了一个专属的 SSH 程序，路径通常在 &lt;code&gt;C:\Program Files\Git\usr\bin\ssh.exe&lt;/code&gt;。执行 &lt;code&gt;git clone&lt;/code&gt; 时，Git 会强制调用自带的内部 SSH。由于该程序运行在一个模拟的 Linux 环境 MSYS2 中，它对文件路径的解析或对 Windows 系统 ssh-agent 密钥代理服务的读取存在偏差。这导致它在连接 GitHub 时交不出密钥，从而被服务端拒绝。&lt;/p&gt;
&lt;h2 id=&#34;四解决方案&#34;&gt;四、解决方案
&lt;/h2&gt;&lt;p&gt;明确了问题是环境割裂导致的，修复逻辑就是统一底层调用。我们需要通过 Git 的全局配置，覆写它的默认行为，强制 Git 放弃内部自带的 SSH，转而调用 Windows 系统的原生 SSH 程序。&lt;/p&gt;
&lt;p&gt;在终端执行以下配置命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global core.sshCommand &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/Windows/System32/OpenSSH/ssh.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行完毕后，Git 的网络操作与系统的 ssh 命令彻底打通，底层调用的都是同一个能正确找到密钥的程序。再次执行 &lt;code&gt;git clone&lt;/code&gt; 即可顺利拉取代码。&lt;/p&gt;
&lt;h2 id=&#34;五总结&#34;&gt;五、总结
&lt;/h2&gt;&lt;p&gt;在开发环境搭建中，多套工具链附带的同名依赖组件往往是引发底层冲突的根源。遇到配置生效不一致的情况，利用 &lt;code&gt;GIT_SSH_COMMAND=&amp;quot;ssh -v&amp;quot;&lt;/code&gt; 这类环境变量暴露出底层的真实调用路径，是打破信息差、快速定位问题的有效手段。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
