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

Posted

技术标签:

【中文标题】Mingw-w64:ssh-add 工作直到 git fetch(连接到代理时出错:文件描述符错误)【英文标题】:Mingw-w64: ssh-add works until git fetch (Error connecting to agent: Bad file descriptor) 【发布时间】:2021-08-05 10:52:18 【问题描述】:

我在 windows/Git bash/MingW64 上,试图自动添加 ssh 密钥以用于 git。 我已经关注了这个guide,只改变了我的私钥文件的路径。 它似乎工作 - 打开 git bash 我得到“成功 添加的身份:/c/users/..."。

ssh-add -l也显示我的key添加正确,端口好像配置好了。

顺便说一句 - 此时 $SSH_AGENT_PIDps 中的进程匹配,$SSH_AUTH_PORT 似乎有效(/tmp/ssh-cEU4wbNe3vo4/agent.927 或类似)

但是当我 cd 进入我的 git repo 并运行 git fetch 我得到:

fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

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

Error connecting to agent: Bad file descriptor

这很奇怪,因为 $SSH_AUTH_PORT$SSH_AGENT_PID 在这一点上没有改变,我已经尝试export他们只是为了确定。

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

git 在做什么弄乱了 SSH 代理?

【问题讨论】:

鉴于该错误,您的 ssh 代理似乎已崩溃。这怎么可能发生,我不知道。 可能有用***.com/questions/62937020/… 【参考方案1】:

在启动 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%

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

set GIT

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

【讨论】:

【参考方案2】:

经过长时间的搜索,我终于找到了它。 Windows 更新破坏了我的设置?,特别是 Openssh。自上次 Windows 更新以来,我每次都必须输入密码,鉴于您的问题是相当新的问题,我怀疑您也是如此。

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

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

   sshCommand = C:/Windows/System32/OpenSSH/ssh.exe

删除它会出现此错误

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

但是,将其替换为

    sshCommand = "C:/Program\\ Files/Git/usr/bin/ssh.exe"

让一切如我所愿。

我认为Error connecting to agent: Bad file descriptor 意味着某些东西在引擎盖下崩溃了,并且考虑到它是从最近开始的,很可能是由于 Openssl 更新。

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

【讨论】:

很好,比我的回答更详细。赞成。【参考方案3】:

我在 Msys2 下使用 ConEmu 工作。 我最近遇到了几个消息Error connecting to agent: Bad file descriptor。 读完这篇文章后,我记得在错误出现前不久尝试过git pull,所以它可能触发了错误。 我没有花时间系统地测试来确认。

根据Reuse in PowerShell a running PuTTY agent (pageant),我检查了问题是否仅与特定组合代理-客户端有关。

鉴于 WinSCP 工作正常(A1-C2 正常),而 Msys2 bash ssh 不是(A1-C3 不正常),我确认问题出在 Msys2 bash ssh-pageant(A1-P1-C3 损坏) ,尽管与您显示的相同检查没有发现任何问题。

$ env | grep SSH
SSH_AUTH_SOCK=/tmp/.ssh-pageant-RY16205
SSH_PAGEANT_PID=1615
$ ps
      PID    PPID    PGID     WINPID   TTY    STIME COMMAND
     1618       1    1618      16144  cons0   Jan 25 /usr/bin/bash
     1615       1    1615      15960  ?       Jan 25 /usr/bin/ssh-pageant

由于问题出在ssh-pageant,我只是简单地重新启动它

    杀死现有的ssh-pageant

     $ /usr/bin/ssh-pageant -k
    

请注意,如果由于某种原因正在运行的ssh-pageant 没有被此命令杀死,您始终可以从任务管理器中执行此操作。

    再次启动ssh-pageant并设置适当的环境变量

     $ eval $(/usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME")
    

    $ /usr/bin/ssh-pageant -r -a "/tmp/.ssh-pageant-$USERNAME"
    SSH_AUTH_SOCK='/tmp/.ssh-pageant-RY16205'; export SSH_AUTH_SOCK;
    SSH_PAGEANT_PID=10014; export SSH_PAGEANT_PID;
    echo ssh-pageant pid 10014;
    $ SSH_AUTH_SOCK='/tmp/.ssh-pageant-RY16205'; export SSH_AUTH_SOCK;
    $ SSH_PAGEANT_PID=10014

而且效果很好。 由于我没有彻底测试,我可能会在新的git pull之后再次遇到问题。

请注意,我在 Msys2 bash 下使用 git,我没有单独的 git 和自己的 ssh。 因此,答案中发布的永久解决方案似乎不适用于我。 我似乎也没有 Windows OpenSSH,所以this 也不适用于我。 我仍然需要找到问题的根本原因。

相关

    https://community.atlassian.com/t5/Sourcetree-questions/ssh-add-l-returning-quot-Error-connecting-to-agent-Bad-file/qaq-p/1654077 https://github.com/cmderdev/cmder/issues/1781

【讨论】:

以上是关于Mingw-w64:ssh-add 工作直到 git fetch(连接到代理时出错:文件描述符错误)的主要内容,如果未能解决你的问题,请参考以下文章

在 minGW-W64 g++ 中编译的 C++ 代码不能在 Ubuntu g++ 中编译

使用 Mingw-w64 交叉编译 CGAL

mingw-w64 文件布局

如何安装 MinGW-w64 和 MSYS2?

在Windows中安装MinGW-w64

MinGW-w32 与 MinGW