安装Cadence后在VS Code中使用SSH上传GitHub出现“Error:Permission Denied(publickey)”错误解决过程

一、问题发生

一直在VS code中使用SSH协议来上传代码至GitHub,便捷稳定。某一天发现执行push命令后,提示”Error:Permission Denied(publickey)”。一开始,以为是账号出现问题,重新设置了git的用户名和邮箱,问题依旧。按GitHub官方”Error:Permission Denied(publickey)”FAQ文档逐一排查,现象依然如此。

无意间注意到,在Git bash中执行

$ ssh -vT git@github.com

命令后,出现的一长串信息中,其中最后几行中显示,SSH程序一直试图在 /d/SPB_Data目录下寻找SSH的私钥,意识到应该是这个路径有问题。

debug1: Trying private key: /d/SPB_Data/.ssh/id_rsa
debug1: Trying private key: /d/SPB_Data/.ssh/id_dsa
debug1: Trying private key: /d/SPB_Data/.ssh/id_ecdsa
debug1: Trying private key: /d/SPB_Data/.ssh/id_ecdsa_sk
debug1: Trying private key: /d/SPB_Data/.ssh/id_ed25519
debug1: Trying private key: /d/SPB_Data/.ssh/id_ed25519_sk
debug1: Trying private key: /d/SPB_Data/.ssh/id_xmss

二、问题解决过程

D盘下SPB_Data文件夹是最近安装Cadence软件后生成的目录,SSH程序怎么会在Cadence生成的目录下查找私钥呢?网上搜索了一番,原来cadence在安装过程中,会生成一个HOME环境变量来指向SPB_Data文件夹。在Git bash中执行

echo $HOME

命令后,发现HOME果然已指向SPB_Data文件夹。

$ echo $HOME
/d/SPB_Data

首先,试图将存放SSH私钥的.ssh文件夹所在目录路径同时赋值给HOME系统变量,两个路径用分号;隔开,结果打开VS Code后,提示无法找到Git安装位置。

删去现HOME系统变量中两个路径的任意一个,VS Code都不再提示此错误,看来HOME目录只能支持一个路径,不支持分号分隔路径,此路不通。

又搜索了一番,发现Stackoverflow网站相关问题的一条评论给出了解决方法,修改Git安装目录下etc文件夹中的nsswitch.conf文件。评论中提到将该文件中的

# nsswith.conf 文件完整路径示例
# C:\Program Files\Git\etc\nsswitch.conf

db_home: env windows cygwin desc

这一行,更改为

db_home: /%H

后,SSH程序将指向%USERPROFILE%系统变量,而这一系统变量的定义为

# <Username>用电脑实际用户名替换,下同

%USERPROFILE% = C:\Users\<Username>

而这正好是Git和SSH的配置文件的存放位置,.ssh文件夹即在此路径下。按照这一方法修改nsswitch.conf文件后, VS Code中可以使用SSH正常上传,问题解决。

三、继续折腾

上传问题解决后,在git bash中执行

$ echo $HOME
/d/SPB_Data

HOME变量仍然指向SPB_Data文件夹。搜索了一番,一些博客文章中提到可以在Git安装目录下etc文件夹下的profile文件开头的注释下方,添加一行如下语句

# profile 文件完整路径示例
# C:\Program Files\Git\etc\profile

HOME="C:\Users\<username>"

可以手动指定HOME路径。按此修改profile文件后,再次在git bash中执行

$ echo $HOME
C:\Users\<Username>

可以看到,HOME系统变量在Git环境下已被修改正确。那这一方法是否可以同时完成HOME系统变量修改和SSH上传问题呢?

nsswitch.conf文件中

db_home: /%H

这一行修改回

db_home: env windows cygwin desc

git bash中执行

$ echo $HOME

得到

$ echo $HOME
C:\Users\<Username>

Git环境中HOME变量输出正常。打开VS Code,使用SSH上传时,重新提示"Error:Permission Denied(publickey)”。

综合以上分析,可以得出以下结论:

  • 修改nsswitch.conf文件,只影响SSH程序查找私钥的位置,并不修改Git环境中HOME系统变量内容;
  • 修改profile文件,只影响Git环境中HOME系统变量内容,SSH程序仍从操作系统HOME变量所指位置查找私钥。

[1]<SSH is looking in the wrong place for the public/private key pair on Windows>

[2]<HOME更改情况下Git for Windows报错git@github.com: Permission denied (publickey)的原因及解决方法_yihuajack的博客-程序员宝宝>

[3]<Git for Windows 2.25.1更改$HOME路径>

[4]<https://www.raineggplant.com/solve-home-variable-conflict-in-git.html>

[5]<Error: Permission denied (publickey) - GitHub Docs>

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐