使用 cygwin ssh-agent 是 运行 但 git 仍然提示输入密码

Using cygwin ssh-agent is running but git is still prompting for passphrase

我在 Windows 7 上使用 cygwin 作为我的终端。我在 cygwin 中发现了一些关于 运行 ssh-agent 的建议,这样我就不必每次都输入密码了运行一个gitfetch/pull/push。我将以下内容添加到我的 .bash_profile 并重新启动了我的 cygwin 会话:

SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent -s | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

# Source SSH settings, if applicable

if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    #ps ${SSH_AGENT_PID} doesn't work under cywgin
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
else
    start_agent;
fi

看起来 ssh-agent 和 ssh-add 运行 成功了,但仍然提示我输入密码。

Initialising new SSH agent...
succeeded
Enter passphrase for /cygdrive/c/Users/<username>/.ssh/id_rsa:
Identity added: /cygdrive/c/Users/<username>/.ssh/id_rsa (/cygdrive/c/Users/<username>/.ssh/id_rsa)

$ ssh-add -l
2048 <fingerprint> /cygdrive/c/Users/<username>/.ssh/id_rsa (RSA)

$ git fetch --all
Fetching origin
Enter passphrase for key '/c/Users/<username>/.ssh/id_rsa':

我的 git 连接实际上使用的是 SSH 而不是 HTTPS(已编辑私人信息):

$ git remote -v
origin  ssh://git@XXX/XXX.git (fetch)
origin  ssh://git@XXX/XXX.git (push)

我发现的与此问题最接近的问题是以下问题:

ssh-agent doesn't work / save me from typing passphrase for git

但是,我没有在 /git/bin 下重命名我的 ssh。

关于如何诊断这个问题有什么建议吗?谢谢!

问题依旧。似乎与不同的路径有关,尚未修复。 您可以考虑使用 expect as an alternatif to ssh-agent for login with passphrase 交互。

在Linux中,它通常是这样安装的:

$ sudo apt-get update
$ apt-get install --assume-yes --no-install-recommends apt-utils expect 

在 cygwin 中,您可以在 Tcl:

下找到它

这是一个简单的使用步骤。

创建一个文件,找到它并命名 ~/.expect_push

#!/usr/bin/expect -f
spawn git push origin master
expect "Username for 'https://github.com':"
send "<username>\n";
expect "Password for 'https://<username>@github.com':"
send "<password>\n";
interact

将上面的 <username><password> 更改为您的登录 ID,并添加以下注释:

  • 根据您的 git 登录交互修改内容。
  • 如果您的 <password> 包含字符 $ 将其设为 $ 否则身份验证将失败。
  • 例如,如果您的密码 mypa$$word,则将 <password> 设为 mypa$$word

创建另一个文件~/.git_push

#!/usr/bin/bash
git remote set-url origin git@github.com:<username>/<repo>.git
git add .
git commit -m "my test commit using expect"
expect ~/.ssh/.expect_push

使它们可执行并在 /bin

中创建符号链接
$ chmod +x ~/.expect_push
$ chmod +x ~/.git_push
$ cd /bin
$ ln -s ~/.git_push push

然后就可以push到远程而不需要填写用户名和密码或者passphrase

$ cd /path/to/your/git/folder
$ push

这里有一个比上面的更简单的解决方案:

  1. 启动服务(可以通过在搜索中输入服务找到 任务栏上的框)
  2. 编辑“OpenSSH 身份验证代理”的设置
  3. 将启动类型设置为自动并启动服务
  4. 启动编辑系统环境变量(类型 Environment 在任务栏的搜索框中)
  5. 添加 GIT_SSH 变量并将值设置为 "C:\Windows\System32\OpenSSH\ssh.exe"

现在添加 SSH 密钥后,您将无需继续在 Windows 命令提示符或 Cygwin Bash shell.[=10 中键入密码=]