185

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

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

每次我开始一个新的 git bash 时。

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

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

4

10 回答 10

171

在 git bash 会话中,您可以将脚本添加到~/.profile~/.bashrc通常设置为~%USERPROFILE%,以便所述会话自动启动ssh-agent. 如果文件不存在,只需创建它。

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

该文章的“在 Git for Windows 上自动启动 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

其他资源:

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

于 2013-08-23T13:50:41.543 回答
34

PS:这些说明是在 Windows 10 Linux 子系统中打开的 Bash shell 的上下文中,并没有提到在 Windows 上使用 Bash 在 Windows 上的 Ubuntu 上生成的符号链接 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 连接到您的 Github 主机或 SSH 配置文件中配置的其他主机,它应该可以正常工作而无需任何额外脚步。

笔记:

谢谢。

于 2017-08-08T08:14:59.287 回答
7

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

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

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

于 2021-01-19T12:26:44.507 回答
6

I found the smoothest way to achieve this was using Pageant as the SSH agent and plink.

You need to have a putty session configured for the hostname that is used in your remote.

You will also need plink.exe which can be downloaded from the same site as putty.

And you need Pageant running with your key loaded. I have a shortcut to pageant in my startup folder that loads my SSH key when I log in.

When you install git-scm you can then specify it to use tortoise/plink rather than OpenSSH.

The net effect is you can open git-bash whenever you like and push/pull without being challenged for passphrases.

Same applies with putty and WinSCP sessions when pageant has your key loaded. It makes life a hell of a lot easier (and secure).

于 2015-03-04T00:57:35.023 回答
3

根据最佳答案,我无法让它工作,可能是因为我是一个 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 密码,您就知道它正在工作。哈利路亚终于奏效了。

于 2020-02-19T19:13:27.530 回答
2

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

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

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

Host *
    AddKeysToAgent yes

通常通过 ssh 连接到您的服务器(或 git pull),并且每次会话只会要求您输入一次密码/密码。

于 2020-06-27T17:02:47.403 回答
2

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

假设

  • 路径中的 ssh 代理
  • shh-add in path(安装 git 时都选择“RED”选项)
  • 私钥在 %USERPROFILE%/.ssh 文件夹中
  • 私钥名称以 id 开头(例如 id_rsa)
于 2017-07-28T05:14:48.430 回答
1

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

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

于 2020-12-27T13:40:49.363 回答
0

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

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

于 2013-08-23T13:50:51.633 回答
0

此答案中的简单两个字符串解决方案

对于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`
于 2017-10-13T20:09:16.827 回答