ssh-add
在尝试完成一项更复杂的任务(涉及硬件安全密钥和用于 SSH 身份验证的 GPG 密钥)的过程中,我在 Windows 10 计算机上遇到了一个棘手的实用程序。很简单,我ssh-add
无法连接到代理,但所有其他 ssh 功能均正常工作。
当我ssh-add -L
在 Powershell 7.0.3 上运行时,我得到以下输出:
Error connecting to agent: No such file or directory
但是,我的ssh-agent
服务似乎运行良好:
C:\Users\[me]> get-service ssh-agent
Status Name DisplayName
------ ---- -----------
Running ssh-agent OpenSSH Authentication Agent
C:\Users\[me]> get-service ssh-agent | select *
UserName : LocalSystem
Description : Agent to hold private keys used for public key authentication.
DelayedAutoStart : False
BinaryPathName : C:\WINDOWS\System32\OpenSSH\ssh-agent.exe
StartupType : Automatic
Name : ssh-agent
RequiredServices : {}
CanPauseAndContinue : False
CanShutdown : False
CanStop : True
DisplayName : OpenSSH Authentication Agent
DependentServices : {}
MachineName : .
ServiceName : ssh-agent
ServicesDependedOn : {}
StartType : Automatic
ServiceHandle :
Status : Running
ServiceType : Win32OwnProcess
Site :
Container :
C:\Users\[me]> get-command ssh-add
CommandType Name Version Source
----------- ---- ------- ------
Application ssh-add.exe 7.7.2.1 C:\WINDOWS\System32\OpenSSH\ssh-add.exe
此外,我在默认位置 ( C:\Users\[me]\.ssh\id_rsa
, C:\Users\[me]\.ssh\id_rsa.pub
) 中有标准的公钥/私钥 SSH 密钥对。我在 GitHub 上广泛使用了此密钥,ssh
它本身在 Powershell 中仍然可以正常工作:
C:\Users\[me]> ssh -T [email protected]
Enter passphrase for key 'C:\Users\[me]/.ssh/id_rsa':
Hi [me]! You've successfully authenticated, but GitHub does not provide shell access.
那么,鉴于 OpenSSH 的其他各个方面似乎都运行良好,为什么会ssh-add
出现故障呢?
我尝试过修复的方法如下:
- 从我的 PATH 中删除其他 SSH 实用程序(例如,由 Git 安装添加的实用程序)。
- 禁用/重新启用 Windows 可选功能“SSH 客户端”(及其对应的“SSH 服务器”,我认为我不需要它)。
- 通过 Chocolatey 安装较新版本的 OpenSSH (https://chocolatey.org/packages/openssh),并通过 PATH 修改将所有命令指向该安装。
- 备份并删除我的
.ssh
文件夹,生成一个新密钥(通过ssh-keygen
),然后从头开始。 ssh-agent
在自动、手动和禁用之间更改服务的启动类型
上述活动似乎都没有任何效果。所有其他ssh
工具都运行良好(假设启用了可选功能并且服务正在运行),但ssh-add
事实并非如此。
其他人对于诊断这个棘手的实用程序还有什么其他建议?
答案1
事实证明,就我而言,我的 PowerShell/Cmd 环境中有一个过时的环境变量。SSH_AUTH_SOCK
它指向一个不存在的套接字/管道,这导致该ssh-add
实用程序(理所当然地)抱怨“没有这样的文件或目录”。
只需完全删除环境变量就可以ssh-add
正常运行:
C:\Users\[me]> Get-Item Env:\SSH_AUTH_SOCK
Name Value
---- -----
SSH_AUTH_SOCK \\.\pipe\this-socket-never-existed
C:\Users\[me]> Remove-Item Env:\SSH_AUTH_SOCK
现在,我之所以SSH_AUTH_SOCK
首先设置,是因为我想在我的硬件安全密钥 (Yubikey) 和 Windows 10 原生 OpenSSH 代理之间建立一座桥梁。就我而言,我试图(但失败了)获取 benpye 的WSL SSH 盛会在启动时运行。
但是,当程序实际上按照文档建议运行时:
C:\Users\[me]> wsl-ssh-pageant.exe --winssh ssh-pageant
C:\Users\[me]> $Env:SSH_AUTH_SOCK = "\\.\pipe\ssh-pageant"
我发现它不仅ssh-add
运行时没有错误,而且在查询时还能识别并使用我的 Yubikey 的公共身份验证密钥。
C:\Users\[me]> ssh-add -L
ssh-rsa [key]
所以 TL;DR 是我对过时的环境变量的疏忽导致以ssh-add
“找不到文件”错误终止。
答案2
我遇到了类似的问题,不过对我来说,这个问题比较普遍,就像这里许多其他人遇到的问题一样。一般来说,这些问题是由于ssh-agent
和之间不匹配而引起ssh-add
的。例如,我运行了 Windows 代理,但我的路径首先指向 Windows 版 Git ssh-add
。
代理和添加之间的任何不一致都会导致某些事情有效而某些事情无效的情况。常见的结果是可怕的Permission denied (publickey)
错误。典型的情况是测试连接有效,但操作失败。发生这种情况是因为命令针对多个代理运行。但是,代理的 ssh 密钥数据库是专有的,因此只能通过相同供应商的命令访问。ssh -T [email protected]
git push
ssh
我无法提供适用于所有环境的修复方法,但会心你有已知的良好环境是关键。如果您在 ssh 中看到奇怪或无法解释的行为,则不太可能是供应商软件中的错误。首先检查您的环境变量和路径是否指向相同的 ssh 安装。然后验证它们正在使用哪些 gitconfig 和 ssh 配置文件,以及其中的数据是否与您的 ssh 安装不冲突。最后,如果您在 IDE 中工作,请确保其配置符合上述所有要求。
答案3
我认为作者使用了 Windows 自带的捆绑 OpenSSH,而对我来说出现的一个问题是 Git 默认使用与其自身捆绑的 ssh(例如,检查 Git Bash 内部的输出which ssh-add
,并将其与Get-Command ssh-add
内部 PowerShell 进行比较)。
一种解决方案是让 Git 使用内置 SSH:
# "C:/Windows/System32/OpenSSH/ssh.exe" is the result of Get-Command ssh
git config --global core.sshcommand "C:/Windows/System32/OpenSSH/ssh.exe"
答案4
当我重新安装 git 时,有一个选项可以使用 Windows OpenSSH 而不是 git 自己的 ssh,然后我的 git bash 能够使用 ssh-add -l 访问 Windows 自己的 ssh-agent,VSCODE 成功同步了更改。