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


152

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

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

每次我开始新的git bash时。

有没有办法永久设置ssh代理?还是Windows具有管理ssh密钥的好方法?

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


3
/my/ssh/location/equalivent喜欢的东西/c/Users/Foobar/.ssh/
尼克,

一个类似的问题已经发布在superuser.com/q/1238486/478378上,现在已解决。以下要点包含所有细节gist.github.com/jiggneshhgohel/afe96f0d57bdbf8beba305a73905402d。谢谢。
Jignesh Gohel '17

Answers:


138

在一个Git bash命令,你可以添加一个脚本~/.profile~/.bashrc~被通常设置为%USERPROFILE%)自动,为了表示会话启动ssh-agent。如果该文件不存在,则只需创建它。

这就是GitHub在“ 使用SSH密钥密码短语 ”中描述的内容 ”中描述的内容。

该文章的“ 在Windows的Git上自动启动ssh-agent ”部分具有一个健壮的脚本,可以检查该代理是否正在运行。下面仅是一个片段,有关完整的解决方案,请参见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

其他资源:

让ssh-agent与从Windows命令外壳运行的git一起使用 ”具有类似的脚本,但是我主要参考上面的GitHub文章,该文章更加健壮且是最新的。


我有一点烦恼,就是如果我知道我不会使用git,而又不想输入ssh密钥密码,那么我打开的每个shell都会再次询问它。这是状态1,代理程序正在运行,并且没有密钥,因此您可以从本部分中删除ssh-add,然后如果您第一次不输入密码,则直到您手动运行ssh-add时,才会再次询问您。
Andy2K11 '18

@Gordon该help.github.com/articles/working-with-ssh-key-passphrases GitHub链接的哪一部分已更改?它的内容仍然存在,并且似乎仍然与此答案相关。
VonC

1
@ Andy2K11如果您想在第一次需要密码时输入密码,而不是在打开外壳时输入密码,对我来说,最干净的方法是从.bash_profile中删除ssh-add,正如您提到的,并在其中添加“ AddKeysToAgent yes”您的.ssh / config文件(请参阅此答案:superuser.com/a/1114257/523133)。这样,您甚至不必记住运行ssh-add。
硬性设定

30

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

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代理$ ssh-add ~/.ssh/id_work_gmail,然后您应该能够使用ssh连接到github帐户或远程主机。例如,在上述代码示例的上下文中:

$ ssh github.com-<YOUR_GITHUB_USERNAME>

要么

$ ssh <USER>@csexperimental.abc.com

要求将密钥添加到SSH代理仅执行一次。

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

注意:

谢谢。


1
有趣的选择,使用WSL。+1
VonC

@JigneshGohel谢谢,这个脚本是完美的,而且很干净!我只是想知道,为什么>> "${SSH_ENV}"呢?难道不是> "${SSH_ENV}"吗?当然,您的文件可以运行,但是最终~/.ssh/environment文件的长度会越来越长,因为(按照我目前的想法!?),这是没有原因的。我觉得这个脚本应该只包含在.bashrcWSL Ubuntu 的默认脚本中,它是如此有用!
MikeBeaton

5

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

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

您还需要plink.exe,可以从与腻子相同的站点下载该文件。

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

当您安装git-scm时,您可以将其指定为使用tortoise / plink而不是OpenSSH。

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

当选美加载了密钥时,腻子和WinSCP会话也是如此。它使生活变得更轻松(更安全)。


2

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

假设

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

真好!+1。我始终使用openssh(而不是腻子),因此对于带有密码短语的私钥来说,这是一个有趣的解决方案。
VonC

就像您已经在github上一样,那么为什么不将源代码设为git存储库呢?
托尔比约恩Ravn的安德森

只需从路径中删除/ releases。;-)
Erez A. Korn

1

我无法根据最佳答案来解决这个问题,这可能是因为我是PC的新手,并且缺少明显的东西。但是,仅供参考,以防万一它可以帮助像我这样面临挑战的人,最终的工作是通过此处的链接之一(答案中引用了)。这仅涉及以下内容.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

我可能配置了一些奇怪的东西,但是当我将其添加到.profileor中时却没有成功.bashrc。我遇到的另一个真正的挑战是,我不是这台计算机的管理员,并且未经IT部门的批准也无法更改环境变量,因此这是无法访问环境变量的解决方案。

如果您在打开git bash时提示输入ssh密码,则知道它正在工作。Hallelujah终于奏效了。


1

将其放在您的〜/ .bashrc(或从中获取文件)中,这将阻止每个shell不必要地多次运行它:

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

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

Host *
    AddKeysToAgent yes

正常情况下ssh到服务器(或git pull),则每次会话仅要求您输入一次密码。


0

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

在那里,您可以在每次启动bash时放置要执行的命令


它必须工作。尝试在该.bashrc文件中放入简单的内容(例如echo test,在执行Git Bash时检查其是否已加载。)
David FerenczyRogožan2016年

还要注意,PowerShell中的〜可能与Git Bash / Cygwin中的〜有所不同,这取决于所安装的版本和指定的用户选项。
dragon788

@Yar在Windows上,放入.bashrc用户文件夹,例如C:\Users\john
Martin van Driel'9

0

来自此答案的简单的两字符串解决方案

对于sh bash等:

# ~/.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`
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.