我正在使用Git Bash。我必须使用
eval `ssh-agent.exe`
ssh-add /my/ssh/location/
每次我启动新的Git Bash时,是否有一种方法可以永久设置SSH代理?或者Windows有管理SSH密钥的好方法吗?作为一个新手,请给我提供详细的教程,谢谢!2013年:在 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
其他资源:
"在Windows命令行中运行git时让ssh-agent工作"有一个类似的脚本,但我主要会参考上面的GitHub文章,它更加健壮和更新。
hardsetting
在评论中添加(2018):
如果你想第一次需要密码时输入密码,而不是在打开shell时输入密码,我认为最干净的方法是:
- 从
.bash_profile
中删除ssh-add
,并且- 在你的
.ssh/config
文件中添加"AddKeysToAgent yes
"(请参见"如何使ssh-agent
自动按需添加密钥?")。这样你甚至不用记得运行
ssh-add
。
值得注意的是,为什么这个脚本在Windows上特别有意义,而不是像其他答案中由@JigneshGohel指出的更标准的linuxey脚本:
通过完全不依赖
SSH_AGENT_PID
,这个脚本可以在不同的msys和cygwin环境中使用。
代理可以在msys2中启动,并且仍然可以在git bash
中使用,因为SSH_AUTH_SOCK
路径可以在任何一个环境中到达。
一个环境中的PID无法在另一个环境中查询,因此基于PID的方法会在每次切换时重置/创建新的ssh-agent
进程。
P.S:这些说明是针对在Windows 10 Linux子系统中打开的Bash shell,并且不涉及将在Windows上生成的SSH密钥与“Bash on Ubuntu on Windows”链接的问题。
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配置文件中配置的主机,这样就不需要任何额外步骤。
注意:
如果遇到 ~/.ssh/config
上的错误:“Bad owner or permissions”,则使用命令 chmod 600 ~/.ssh/config
更新权限。 参考:https://serverfault.com/a/253314/98910
为使上述步骤生效,您需要 OpenSSH v7.2及更高版本。 如果您拥有较旧的版本,则可以使用https://dev59.com/i1oV5IYBdhLWcg3wRtHa#41555393中提到的步骤进行升级。
相同的详细信息可以在Windows 10 Linux子系统SSH-agent问题中找到。
谢谢。
>> "${SSH_ENV}"
?难道不应该只是 > "${SSH_ENV}"
吗?当然你的方法也可以运行,但是它会让 ~/.ssh/environment
文件变得越来越长,而且没有必要(至少我现在是这么认为的!)... 非常感谢!我觉得这个脚本应该被包含在 WSL Ubuntu 的默认 .bashrc
中,因为它非常有用! - MikeBeaton~/.ssh/environment
。它应该包含什么内容? - Ellen Spertus~/.ssh/environment
这个文件。它应该包含什么内容? - undefinedC:\Users\tiago\.ssh
(至少在我的情况下)创建名为config的文件,并添加以下内容。Host github.com
HostName github.com
User your_user_name
IdentityFile ~/.ssh/your_file_name
然后只需打开Git Bash,您就可以推送而无需手动启动ssh-agent并添加密钥。
我无法根据最佳答案使其工作,可能是因为我是个电脑新手,缺少一些显而易见的东西。但是只要提供给像我一样有挑战性的人一个提示,FINALLY成功的方法是通过下面其中一个链接中的一个(参考答案)。这仅涉及将以下内容简单粘贴到我的.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 中(或从中 source 的文件),这样可以防止它在每个 shell 中不必要地运行多次:
if [ -z "$SSH_AGENT_PID" ]; then
eval `ssh-agent -s`
fi
然后在 ~/.ssh/config 文件中添加 "AddKeysToAgent yes":
Host *
AddKeysToAgent yes
正常 ssh 连接到您的服务器(或 git pull),您只会在每个会话中被要求输入一次密码/密码短语。
.bashrc
文件中(例如echo test
),并检查在执行Git Bash时是否已加载。 - David Ferenczy Rogožan.bashrc
文件放置于用户文件夹中,例如C:\Users\john
。 - Martin van Drielssh-agent
中,如果您正在使用远程git仓库,则不必担心这个问题。我只想把完整的脚本和所有指令放在一个地方。
在Windows 10上测试,使用Git For Windows 2.41.0-64位版本。
在Git Bash中,创建你的~/.bashrc
文件echo
命令:~/.bashrc
文件的更改。. ~/.bashrc
手动重新加载~/.bashrc
文件,或者:~/.bashrc
文件中的脚本。ssh-add
时,具有标准路径的私钥(例如~/.ssh/id_ed25519
或~/.ssh/id_rsa
)会自动添加。但是,如果您有具有自定义名称或路径的私钥,请现在添加它们:现在,你只需要在Windows重新启动时输入每个ssh密钥的私人密码一次,而不是在每次ssh-agent进程将持续运行,直到您退出登录、关闭计算机或终止该进程。
git push
或git pull
操作,或每次Git Bash终端中,这两种方式都很烦人。
/my/ssh/location/
和/c/Users/Foobar/.ssh/
这样的路径是等价的吗? - Nickssh -Tv git@server-host-name
可以工作,在我这个案例中,是由于 GIT_SSH 环境变量设置为 Tortoise Git 的 Putty Plink。删除 GIT_SSH 就解决了问题,TortoiseGit 仍然可以正常使用。 - Poutrathorssh-add ~/.ssh/my_private_key.pem
。 - Ben