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

我使用 git bash。我必须使用

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

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

是否有一种方法来设置ssh代理永久?或者窗户有一个好办法 管理SSH密钥?< / p >

我是一个新人,能给我详细的教程吗,谢谢!

226833 次浏览

2013:在git bash会话中,您可以向~/.profile~/.bashrc (__ABC3通常被设置为%USERPROFILE%)添加脚本,以便该会话自动启动ssh-agent
如果该文件不存在,就创建它

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

< p >“在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

其他资源:

让ssh-agent与git一起工作从windows命令shell运行"有一个类似的脚本,但我主要参考上面的GitHub文章,这是更健壮和最新的。


hardsetting的评论(2018)中添加:

如果你想在第一次需要它时输入密码,而不是在打开shell时,对我来说最干净的方法是:

  • .bash_profile中删除ssh-add,以及
  • 添加“AddKeysToAgent yes"到你的.ssh/config文件(参见“__abc3”)。

这样你甚至不需要记住运行ssh-add


并且的评论(2022)中添加:

值得注意的是,为什么这个脚本在Windows中特别有意义,而不是(例如)@JigneshGohel另一个答案中指出的更标准的linuxey脚本:

通过完全不依赖SSH_AGENT_PID,这个脚本可以跨不同的msys &cygwin环境。
代理可以在msys2中启动,并且仍然在git bash中使用,因为在这两种环境中都可以到达SSH_AUTH_SOCK路径。
来自一个环境的PID无法在另一个环境中查询,因此基于PID的方法会不断在每个交换机上重置/创建新的ssh-agent进程

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

在这里,您可以在每次启动bash时执行您想要执行的命令

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

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

你还需要plink.exe,它可以从putty网站下载。

你还得带着钥匙开选美比赛。我在我的启动文件夹中有一个快捷方式,当我登录时加载我的SSH密钥。

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

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

当pageant加载密钥时,同样适用于putty和WinSCP会话。它让生活变得更容易(也更安全)。

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

假设:

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

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

1)更新你的. bashrc,在其中添加following

# 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配置文件(如果不存在)。使用以下命令创建一个新的

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配置文件中配置的其他主机,它应该可以工作,不需要任何额外的步骤。

注意:

谢谢。

简单的双字符串解决方案 from 这个答案:

对于上海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`

我不能让这个工作基于最好的答案,可能是因为我是这样一个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

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

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

把这个放在你的~/里。Bashrc(或它的源文件),这将阻止它在每个shell不必要地多次运行:

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

然后添加“AddKeysToAgent yes"~ / . ssh / config:

Host *
AddKeysToAgent yes

SSH到你的服务器(或git拉)正常,你只会被要求密码/密码短语每会话一次。

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

自readme包含了如何设置脚本的说明,这样每次你打开一个新窗口/选项卡时,私钥都会自动添加到ssh-agent中,如果你使用远程git存储库,你不必担心这个问题。

如果目标是能够在你想要的时候推送到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并添加密钥。