使用 Windows 10 的 OpenSSH 从 git bash 运行 ssh-add

使用 Windows 10 的 OpenSSH 从 git bash 运行 ssh-add

我已经按照以下说明设置了 OpenSSH2019 年该问题的更新包括设置GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exe。效果很好,但使用 git 时git bash出现以下错误:

$ git pull
CreateProcessW failed error:193
ssh_askpass: posix_spawn: Unknown error
[email protected]: Permission denied (publickey).
fatal: Could not read from remote repository.

如果我使用ssh-addgit bash我会得到不同的错误:

$ ssh-add
Could not open a connection to your authentication agent.

这似乎是因为ssh-add使用的是/usr/bin/ssh-add而不是ssh-addC:\Windows\System32\OpenSSH\,为了纠正这个问题,我尝试使用完整路径:

$ /c/Windows/System32/OpenSSH/ssh-add.exe
CreateProcessW failed error:193
ssh_askpass: posix_spawn: Unknown error

这给了我和以前一样的错误。

我如何使用 Windows 的 OpenSSH 命令git bash

答案1

我遇到了同样的问题,并发现在git bash之前添加/usr/binPATH

我真正棘手的解决方案是将 OpenSSHs 的路径添加ssh-add到我的路径中.bashrc

PATH="/c/Windows/System32/OpenSSH:${PATH}"

答案2

我知道这个话题有点老了,但是我最近偶然发现了这个问题并找到了解决方案。

根据 OpenSSH 文档,askpass 用于显示密码 gui。并且,OpenSSH 仅在设置了环境变量 SSH_ASKPASS 时才尝试使用此“askpass 命令”!因此,解决此问题的最简单方法是取消设置此环境变量。

unset SSH_ASKPASS

只需将其放入 .bash_profile 和/或 .bashrc 中,然后重新打开 shell 即可查看效果。您甚至可以先在打开的 shell 中执行它来测试它,但显然不是那么永久的。

答案3

添加以下代码片段github 文档.bashrc在里面gitbash 外壳对我有用:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2=agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

阅读完整说明github 文档

答案4

对于我来说,在 win11 上按照以下步骤操作,当我添加带密码的 ssh 私钥,然后重启我的电脑,然后再次启动 gitbash 时,我不需要再次输入密码,所以对我来说没问题!希望它也适合你!

这里重要的一步是设置具有适当权限的 ssh 私钥,我的操作系统是Win11 21H2,git版本是git版本 2.40.0.windows.1,以下步骤对我来说很有效。你可以参考一下。

首先,设置具有适当权限的正确 ssh 私钥,

  1. 选择文件(ssh私钥),右键单击,选择文件特性
  2. 点击安全选项卡,点击先进的按钮,在弹出窗口中,然后
  3. 你可能会看到很多用户有 ssh 私钥访问能力,那么
  4. 点击禁用继承按钮,在弹出窗口中选择第一,它将清理继承自驱动器的属性(如E:\\
  5. 添加或者添加用户,然后选择添加主体或者添加对象在弹出窗口中,输入你的电脑用户名,点击右键检查姓名,结果将变成类似电脑名\用户名,然后点击好的按钮确认
  6. 删除所有其他用户,只留下刚刚添加的用户名,也就是电脑名\用户名,然后点击好的按钮

设置正确的 Windows OpenSSH for GitBash 命令,windows openssh for windows 11 位于C:\Windows\System32\OpenSSH\(如果没有,请搜索)

  1. ~/..profile使用以下行进行编辑

    导出 PATH="/C/Windows/System32/OpenSSH/":$PATH

  2. 启动 GitBash,然后确保在 GitBash 中可以获取 Windows 系统 ssh 命令:运行以下命令进行检查which ssh,命令的输出应该显示(或类似内容)

    /c/Windows/System32/OpenSSH/ssh.exe

接下来就很简单了,只需做正常的事情:

  • ssh-add -l查看是否ssh-agent启动,若未启动则执行
  • ssh-add path/to/you/ssh/private/key关键操作者上层台阶
  • ssh-add -l再次检查
  • ssh -T [email protected]

以下是我使用的 shell 脚本,适用于 windows 和 linux。你可以参考它。复制并设置 SSH 私钥文件路径为你自己的,然后将其保存到文件中,例如~/.ssh/EnableGitHubSSH.shsource ~/.ssh/EnableGitHubSSH.sh,然后在 中添加一行代码~/.profile,就大功告成了!尝试使用 luanch GitBash 或终端进行 github SSH 登录检查!

is_windows=$(uname -s | grep '[MINGW|MSYS_NT|CYGWIN_NT]')
if [ -n "${is_windows}" ]; then
  # 将系统 OpenSSH 查找路径提前
  # 删除 $HOME/bin (Git为啥会有这个设置?)
  # Windows 系统 PATH 修正,使用系统默认 OpenSSH, 不用每次重启后都输入密码
  # NOTE: 使用系统默 OpenSSH 时, 密码加密保存在系统中,SSH 的配置目录在 C 盘用户目录下
  XPATH=$(echo $PATH | sed "s#/c/Windows/System32/OpenSSH:##g" | sed "s#$HOME/bin:##g");
  export PATH="/c/Windows/System32/OpenSSH":$XPATH;
  unset XPATH;
fi

# 自动生成的文件,缓存Agent运行状态
tmpfile=~/.ssh/_SSHAgentEnvInfo.sh

# SSH私钥(GitHub免密登录认证)
sec_key=~/.ssh/YOUR-SSH-PRIVATE-KEY-ONE

test -f "$tmpfile" && source "$tmpfile" >| /dev/null

# agent_run_state:
# 0 = agent running with key
# 1 = agent running without key
# 2 = agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

# 添加 Git 免密登录 GitHub 使用的 SSH 私钥
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
  if [ -z "${is_windows}" ]; then
    # Linux 需要运行的命令
    (umask 077; ssh-agent -s >| "$tmpfile")
    source "$tmpfile" >| /dev/null
  else
    # Win 11 手动配置 OpenSSH 开机启动
    # SSH_AUTH_SOCK 随便设置一个值,防止每次启动 GitBash 都加载私钥(需要输入密码)
    echo "SSH_AUTH_SOCK=OK;" > "$tmpfile"
  fi
  ssh-add "$sec_key" 2>/dev/null
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
  ssh-add "$sec_key" 2>/dev/null
fi

unset tmpfile sec_key is_windows

相关内容