Mingw-w64: ssh-add在执行git fetch前能正常工作(连接代理时出现错误:坏的文件描述符)

7
我正在使用Windows/Git Bash/MingW64,尝试自动添加用于Git的ssh密钥。 我遵循了这个guide,只改变了我的私钥文件的路径。它似乎有效-当打开Git Bash时,我会得到“succeeded Identity added: /c/users/…”。 ssh-add -l也显示我的密钥已正确添加,并且端口似乎已配置。 顺便说一句-此时$SSH_AGENT_PID与ps中的进程匹配,$SSH_AUTH_PORT似乎有效(/tmp/ssh-cEU4wbNe3vo4/agent.927或类似)。 但是,当我进入我的git存储库并运行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代理已经崩溃了。为什么会发生这种情况,我不清楚。 - torek
可能有用 https://dev59.com/1bzpa4cB1Zd3GeqPGjjW - sancho.s ReinstateMonicaCellio
4个回答

5
最终,在漫长的搜索之后,我找到了它。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更新引起的。

P.S. 您可以通过检查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),我检查了问题是否仅限于特定的代理客户端组合。

enter image description here

考虑到WinSCP工作正常(A1-C2 ok),而Msys2 bash ssh没有(A1-C3 not ok),我确认问题出在Msys2 bash ssh-pageant(A1-P1-C3 broken),即使您展示的相同检查未表明任何问题。

$ 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,所以我只需重启它:

  1. Killing the existing ssh-pageant

     $ /usr/bin/ssh-pageant -k
    
请注意,如果出于任何原因,使用此命令未能结束正在运行的ssh-pageant,您始终可以从任务管理器中完成此操作。
  1. Launch again ssh-pageant and set appropriate environment variables

     $ 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,我没有自己的ssh。 因此,答案中发布的永久解决方案似乎不适用于我。 我似乎也没有Windows OpenSSH,因此这个对我也不适用。 我仍然需要找到我的问题的根本原因。

相关:

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

0
在Windows上启用openssh后,我遇到了这个问题。它在Powershell下正常工作,但在git-bash中,在使用git命令后会出现OP的错误。
一个解决办法是设置
git config --global core.sshCommand=C:/Program\ Files/Git/usr/bin/ssh.exe

但是这在Powershell中破坏了git的ssh访问。
我决定在git-bash中创建一个别名,将ssh.exe设置为每个git命令的默认选项,像这样:
alias git="git -c core.sshCommand='C:/Program\ Files/Git/usr/bin/ssh.exe'"

你可以将这段代码放入用户目录下的.bash_profile文件中,这样每次打开git-bash窗口时都会自动运行。这个别名会将git这个单词静默地替换为引号中的命令。

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%

请确保您的环境变量中没有定义 GIT_SSH(_xxx)

在启动 bash 之前在相同的 CMD 中输入该命令。

set GIT

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接