Mingw-w64:ssh-add 一直有效,直到 git fetch (连接到代理时出错:文件描述符错误)

Jon*_*vin 7 git ssh ssh-agent git-bash mingw-w64

我在 windows/Git bash/MingW64 上,尝试自动添加 ssh 密钥以与 git 一起使用。我已按照本指南进行操作,仅更改私钥文件的路径。它似乎有效 - 打开 git bash 时我得到“成功添加身份:/c/users/...”。

ssh-add -l还显示我的密钥已正确添加,并且端口似乎已配置。

顺便说一句 - 此时与$SSH_AGENT_PID中的过程匹配ps并且$SSH_AUTH_PORT似乎有效(/tmp/ssh-cEU4wbNe3vo4/agent.927或类似)

但是当我 cd 进入我的 git 存储库并运行时,git fetch我得到:

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
Run Code Online (Sandbox Code Playgroud)

之后,ssh-add不再起作用,打印:

Error connecting to agent: Bad file descriptor
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为此时$SSH_AUTH_PORT和 都$SSH_AGENT_PID 没有改变export,我已经尝试过它们只是为了确定。

启动新的 SSH-AGENT 并添加我的密钥可以在同一个终端会话中工作,但git fetch再次尝试将产生相同的效果。

git 做了什么扰乱了 SSH 代理?

JBS*_*rro 7

经过长时间的寻找终于找到了。Windows 更新破坏了我的设置,特别是 Openssh。自上次 Windows 更新以来,我每次都必须输入密码,并且考虑到您的问题是最近才提出的,我怀疑您也是如此。

我认为Win32-OpenSSH#1693是相关的。

在我的~/.gitconfig里面[core]有一行(我不记得我之前遇到过什么问题)

   sshCommand = C:/Windows/System32/OpenSSH/ssh.exe
Run Code Online (Sandbox Code Playgroud)

删除它会出现此错误

error: cannot spawn C:/Windows/System32/OpenSSH/ssh3.exe: No such file or directory
error: cannot spawn C:/Windows/System32/OpenSSH/ssh3.exe: No such file or directory
fatal: unable to fork
Run Code Online (Sandbox Code Playgroud)

但是,将其替换为

    sshCommand = "C:/Program\\ Files/Git/usr/bin/ssh.exe"
Run Code Online (Sandbox Code Playgroud)

一切都按我的预期进行。

我认为Error connecting to agent: Bad file descriptor这意味着引擎盖下有东西崩溃了,而且考虑到它是最近发生的,很可能是由于 Openssl 更新造成的。

PS 您可以通过检查 .txt 文件中的“修改日期”来检查您的 OpenSSL 是否已更新C:\Windows\System32\OpenSSH。对我来说,这是最近发生的事情,与 ssh-agent 停止运行的那一刻一致。


Von*_*onC 0

在启动 git bash 和 SSH 命令之前,首先尝试简化 %PATH%。

在新的 CMD 中,用于测试:

set PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\
set GH=C:\path\to\git
set PATH=%GH%\bin;%GH%\usr\bin;%GH%\mingw64\bin;%GH%\mingw64\libexec\git-core;%PATH%
Run Code Online (Sandbox Code Playgroud)

确保您的环境变量没有GIT_SSH(_xxx)定义。
输入相同的 CMD(在启动 bash 之前)

set GIT
Run Code Online (Sandbox Code Playgroud)

然后检查问题是否仍然存在。