在 Windows 上启动 Git Bash 时运行 SSH 代理

Posted

技术标签:

【中文标题】在 Windows 上启动 Git Bash 时运行 SSH 代理【英文标题】:Running SSH Agent when starting Git Bash on Windows 【发布时间】:2013-08-26 14:09:55 【问题描述】:

我正在使用 git bash。我必须使用

eval `ssh-agent.exe`
ssh-add /my/ssh/location/

每次我启动一个新的 git bash 时。

有没有办法永久设置 ssh 代理?还是windows有什么好办法 管理 ssh 密钥?

我是新手,请给我详细的教程,谢谢!

【问题讨论】:

/my/ssh/location/ 等同于 /c/Users/Foobar/.ssh/? superuser.com/q/1238486/478378 已发布类似问题,现已解决。以下要点包含所有详细信息gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d。谢谢。 对于遇到这个问题的人,如果你的 ssh -Tv git@server-host-name 有效,在我的例子中,它是从 Tortoise Git 设置为 Putty Plink 的 GIT_SSH 环境变量。删除 GIT_SSH 就可以了。 TortoiseGit 仍然可以正常工作。 ^ 解决@Nick 的upvoted 评论问题:不,它不能是目录,它必须是私钥文件,例如ssh-add ~/.ssh/my_private_key.pem. 【参考方案1】:

在 git bash 会话中,您可以将脚本添加到 ~/.profile~/.bashrc (with ~ being usually set to %USERPROFILE%),以便所述会话自动启动 ssh-agent。如果文件不存在,只需创建它。

这就是 GitHub 在“Working with SSH key passphrases”中描述的内容。

该文章的“Auto-launching ssh-agent on Git for Windows”部分有一个强大的脚本,用于检查代理是否正在运行。下面只是一个 sn-p,完整的解决方案请参见 GitHub 文章。

# This is just a snippet. See the article above.
if ! agent_is_running; then
    agent_start
    ssh-add
elif ! agent_has_keys; then
    ssh-add
fi

其他资源:

“Getting ssh-agent to work with git run from windows command shell”有类似的脚本,但我主要参考上面的 GitHub 文章,它更健壮且最新。

【讨论】:

我有点烦恼的是,如果我知道我不会使用 git,我不会输入 ssh 密钥密码,然后我打开的每个 shell 都会再次要求它。这是状态 1,代理运行 w/o 密钥,因此您可以从此部分中删除 ssh-add,然后如果您第一次没有输入密码,在您手动运行 ssh-add 之前不会再次询问您。 @Gordon help.github.com/articles/working-with-ssh-key-passphrases GitHub 链接的哪一部分发生了变化?它的内容仍然存在,并且似乎仍然与此答案相关。 @Andy2K11 如果您想在第一次需要时输入密码,而不是在打开 shell 时输入,对我来说最干净的方法是从 .bash_profile 中删除 ssh-add,正如您所提到的,并将“AddKeysToAgent yes”添加到您的 .ssh/config 文件中(请参阅此答案:superuser.com/a/1114257/523133)。这样你甚至不必记住运行 ssh-add。【参考方案2】:

PS:这些说明是在 Windows 10 Linux 子系统中打开的 Bash shell 的上下文中,并没有提到在 Windows 中生成的 SSH 密钥与 Windows 上的 Ubuntu 上的 Bash 进行符号链接

1) 通过在其中添加以下内容来更新您的 .bashrc

# Set up ssh-agent
SSH_ENV="$HOME/.ssh/environment"

function start_agent 
    echo "Initializing new SSH agent..."
    touch $SSH_ENV
    chmod 600 "$SSH_ENV"
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' >> "$SSH_ENV"
    . "$SSH_ENV" > /dev/null
    /usr/bin/ssh-add


# Source SSH settings, if applicable
if [ -f "$SSH_ENV" ]; then
    . "$SSH_ENV" > /dev/null
    kill -0 $SSH_AGENT_PID 2>/dev/null || 
        start_agent
    
else
    start_agent
fi

2) 然后运行$ source ~/.bashrc 重新加载您的配置。

以上步骤取自https://github.com/abergs/ubuntuonwindows#2-start-an-bash-ssh-agent-on-launch

3) 创建一个 SSH 配置文件(如果不存在)。使用以下命令创建一个新的:.ssh$ touch config

4) 关注~/.ssh/config

Host github.com-<YOUR_GITHUB_USERNAME> 
HostName github.com
User git
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes


Host csexperimental.abc.com
IdentityFile ~/.ssh/id_work_gmail # path to your private key
AddKeysToAgent yes

<More hosts and github configs can be added in similar manner mentioned above>

5) 使用命令$ ssh-add ~/.ssh/id_work_gmail 将您的密钥添加到 SSH 代理,然后您应该能够使用 ssh 连接到您的 github 帐户或远程主机。例如在上述代码示例的上下文中:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

$ ssh <USER>@csexperimental.abc.com

向 SSH 代理添加密钥应该只需要执行一次。

6) 现在退出 Windows Linux 子系统上的 Bash 会话,即再次退出所有 Bash 控制台并再次启动新控制台并尝试 SSH 到您的 Github 主机或 SSH 配置文件中配置的其他主机,它应该可以在没有需要任何额外的步骤。

注意:

如果您遇到Bad owner or permissions on ~/.ssh/config,则使用命令chmod 600 ~/.ssh/config 更新权限。参考:https://serverfault.com/a/253314/98910

要使上述步骤生效,您需要 OpenSSH v 7.2 及更高版本。如果您有旧版本,可以使用https://***.com/a/41555393/936494

中提到的步骤进行升级

可以在 gist Windows 10 Linux Subsystem SSH-agent issues

中找到相同的详细信息

谢谢。

【讨论】:

有趣的替代方案,使用 WSL。 +1 @JigneshGohel 谢谢你,这个脚本很完美而且很干净!我只是想知道,为什么你有&gt;&gt; "$SSH_ENV"?不应该只是&gt; "$SSH_ENV"吗?当然,你的工作有效,但它最终会慢慢变得越来越长~/.ssh/environment 文件,因为(正如我目前认为的那样!?)没有理由......不过非常感谢!我觉得这个脚本应该只包含在 WSL Ubuntu 的默认 .bashrc 中,它非常有用! 请注意,如果您想加载默认以外的 SSH 密钥,请将“/usr/bin/ssh-add”行更改为“/usr/bin/ssh-add”您的密钥名称>"【参考方案3】:

如果目标是能够随时推送到 GitHub 存储库,那么在 Windows 中的 C:\Users\tiago\.ssh 下存储密钥的位置(至少在我的情况下),创建一个名为 config 的文件并添加以下内容在里面

Host github.com
    HostName github.com
    User your_user_name
    IdentityFile ~/.ssh/your_file_name

然后只需打开 Git Bash,您就可以推送,而无需手动启动 ssh-agent 并添加密钥。

【讨论】:

【参考方案4】:

我发现实现此目的最顺畅的方法是使用 Pageant 作为 SSH 代理和 plink。

您需要为远程中使用的主机名配置一个腻子会话。

您还需要 plink.exe,它可以从与 putty 相同的站点下载。

而且您需要在加载密钥的情况下运行 Pageant。我的启动文件夹中有一个选美的快捷方式,当我登录时它会加载我的 SSH 密钥。

当你安装 git-scm 时,你可以指定它使用 tortoise/plink 而不是 OpenSSH。

最终效果是您可以随时打开 git-bash 并推/拉,而不会受到密码短语的挑战。

同样适用于Putty和Winscp会话当Pageant加载钥匙时。它让生活变得更加轻松(和安全)。

【讨论】:

【参考方案5】:

根据最佳答案,我无法让它工作,可能是因为我是这样的 PC 菜鸟,并且遗漏了一些明显的东西。但仅供参考,以防它帮助像我这样有挑战的人,最终起作用的是通过链接之一here(在答案中引用)。这涉及简单地将以下内容粘贴到我的.bash_profile

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

我可能配置了一些奇怪的东西,但是当我将它添加到我的 .profile.bashrc 时没有成功。我遇到的另一个真正挑战是我不是这台计算机上的管理员,并且在没有得到 IT 批准的情况下无法更改环境变量,所以这是一个解决方案,适用于那些无法访问的人。

如果在您打开 git bash 时系统提示您输入 ssh 密码,您就知道它正在工作。哈利路亚终于奏效了。

【讨论】:

【参考方案6】:

由于我不喜欢在 Windows 中使用 putty 作为解决方法,因此我创建了一个非常简单的实用程序 ssh-agent-wrapper。它会扫描您的 .ssh 文件夹并将您的所有密钥添加到代理。您只需将其放入 Windows 启动文件夹即可运行。

假设

路径中的 ssh 代理 shh-add in path(安装 git 时都选择“RED”选项 私钥在 %USERPROFILE%/.ssh 文件夹中 私钥名称以 id 开头(例如 id_rsa)

【讨论】:

不错! +1。我总是使用 openssh(而不是 putty),因此对于带有密码短语的私钥来说,这是一个有趣的解决方案。 既然你已经在 github 上,那为什么不把源代码做成一个 git 仓库呢? 只需从路径中删除 /releases。 ;-)【参考方案7】:

把它放在你的 ~/.bashrc 中(或者一个来自它的文件),这将阻止它在每个 shell 中不必要地运行多次:

if [ -z "$SSH_AGENT_PID" ]; then
        eval `ssh-agent -s`
fi

然后将“AddKeysToAgent yes”添加到~/.ssh/config:

Host *
    AddKeysToAgent yes

正常 SSH 到您的服务器(或 git pull),每次会话只会要求您输入一次密码/密码。

【讨论】:

【参考方案8】:

我编写了一个脚本并创建了一个 git 存储库,在这里解决了这个问题:https://github.com/Cazaimi/boot-github-shell-win。

自述文件包含有关如何设置脚本的说明,以便每次打开新窗口/选项卡时,私钥都会自动添加到 ssh-agent,如果您无需担心这一点'正在使用远程 git 存储库。

【讨论】:

【参考方案9】:

在 ~ 目录中创建一个新的 .bashrc 文件。

您可以在此处放置每次启动 bash 时要执行的命令

【讨论】:

它必须工作。尝试在 .bashrc 这样的文件中添加一些简单的内容(例如 echo test 并在执行 Git Bash 时检查它是否已加载。 另请注意,PowerShell 中的 ~ 可能与 Git Bash/Cygwin 中的 ~ 不同,具体取决于安装的版本和指定的用户选项。 @Yar 在 Windows 上,将 .bashrc 放在您的用户文件夹中,例如C:\Users\john.【参考方案10】:

简单的两个字符串解决方案来自this answer:

对于 shbash 等:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

对于 cshtcsh 等:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`

【讨论】:

以上是关于在 Windows 上启动 Git Bash 时运行 SSH 代理的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Windows 命令行启动 Git Bash?

如何在启动 git bash 终端之前运行 linux 命令

[LINUX] 在 Win10 上搭建好用的终端开发环境:windows terminal + git bash + zsh + oh-my-zsh

.bash_history 不会在 Git for Windows (git bash) 中更新

无法在 Windows 命令提示符或 git bash 中运行 iex

如何在 Windows 的 Git Bash 中设置别名?