windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决

windows下配置使用ssh方式连接Github/Gitee远程仓库,以及常见连接失败问题的解决方案


在从github/gitee远程仓库获取代码时,除了使用https方式,我们还可以使用ssh连接的方式与远程仓库服务器通信,其好处是有时会比https更方便、稳定、快速。

和与普通的linux服务器连接一样,为了免去每次远程操作都要输入用户名和密码的苦恼,我们可以选择使用 密钥对 的方式免密登录。

下面我将介绍如何创建 ssh密钥对并添加到自己的github/gitee 配置中。同时,对自己在之前的配置过程中遇到的问题进行记录,如密钥对自定义名称后无法自动连接成功(Connection closed by 212.64.63.xxx port 22)、windows下ssh-agent不能随git bash一同启动(Cloud not open a connection to your authentication agent)等,希望可以帮到有需要的同学。

废话完毕,开始操作。


1. 创建SSH密钥对:

在windows下,需要先安装 git 工具。安装完成后,就可以在鼠标右键菜单中找到“Git Bash Here”。点击进入 git bash 命令行窗口。

在命令行窗口中输入 ssh-keygen 命令创建ssh密钥对:

ssh-keygen -t ed25519 -C "[email protected]"

其中,
-t 用于指定创建的秘钥对的签名算法。
-C 后面输入自己的邮箱作为注释,这里的邮箱只是用来生成sshkey中公钥的注释,方便确定这个公钥是用在哪的,你也可以输入其他的任意内容,只要可以方便日后辨认这个公钥即可。它并不会作为我们提交代码时识别身份的ID等凭证(身份信息需要通过git config命令进行配置)。
windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第1张图片

根据提示,可以分别指定密钥对的保存路径和名称,也可以直接使用密钥的默认名称(id_ed25519)。然后指定秘钥对的密码,如果想设置就输入密码,不想设置则直接回车即可。

到此,我们的秘钥对就生成了,可以在自己指定的路径或默认的 C:\\Users\用户名\.ssh\ 目录下查看。公钥(Gitee.pub)的内容是可以公开的,我们之后会将其出示给github/gitee。私钥(Gitee)内容则需要自己保存,不要泄露给他人。

windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第2张图片

2. 将公钥内容粘贴到自己github/Gitee的设置中:

登录自己的github或gitee,在个人设置中找到“安全设置”–“ssh公钥”。这里以Gitee为例进行展示,github的操作与之类似:
windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第3张图片

在网页中,给公钥输入一个名称(随意起名,不过最好能区分出你的登录设备),然后在电脑中使用文本工具打开前面创建的公钥(Gitee.pub)复制其中的内容,粘贴到“公钥”一栏中。点击“确定”。

至此,gitee上的公钥就配置好了。

3. 测试本机能否与github/gitee使用ssh通信:

重点来了,公钥配置好了,私钥在我们本地,那么按理说我们就可以在本机与远程通信了。但是,越到最后越容易出问题。这里需要分两种情况进行讨论:

  1. 创建密钥对时使用默认名称(以id_开头);

  2. 创建密钥对时自定义密钥对名称。

对于使用默认密钥对名称的小伙伴,此时就可以通过 ssh -T [email protected] 命令(github的测试命令为ssh -T [email protected])进行测试(首次测试,会问你是否将gitee主机添加到本机的信任列表继续连接,输入yes回车即可),然后ssh返回 “Hi XXX! You've successfully authenticated, but Gitee.com does not provide shell access.”,这表示可以与远程愉快的通信了。

但是对于使用了自定义密钥对名称的小伙伴,大多数可能会收到“Connection closed by 212.64.63.xxx port 22”或者“Permission denied(publickey)”的响应,表示gitee关闭了我们与其服务器的远程ssh连接。

这是我们可以使用 ssh -vT [email protected] 命令查看连接时的日志信息:

windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第4张图片

可以发现ssh连接时搜索的秘钥默认都是以 id_ 开头的,而不会去搜索我们自定义名称的私钥,所以也就无法认证成功与远程建立连接了。

4. 将自定义名称私钥添加到ssh秘钥搜索列表中:

既然如此,我们就要将自定义名称的私钥自己加到ssh的私钥搜索列表中。

很简单,先执行ssh-agent bash命令连接认证agent(身份验证代理),然后再使用 ssh-add <私钥路径> 命令即可添加。

再次使用 ssh -T [email protected] 命令测试就发现可以连通了。

windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第5张图片

使用 ssh-add -l 可以看到添加的私钥列表:

在这里插入图片描述

……

不过,你以为到这就结束了吗?

太天真了,好事多磨呀。

这时,我们关闭当前的git bash窗口重新打开一个git bash 窗口,再次使用 ssh-add -l 命令查看私钥列表,以及通过ssh -T [email protected] 测试连接发现,私钥并没有添加,连接也连接不上了。

windwos下配置ssh方式连接github/gitee,及常见连接失败问题解决_第6张图片

这是因为之前的操作只在之前的ssh-agent会话窗口中生效了,关闭时就自动清除了。

难道要我们每次打开 git bash 就要手动添加私钥吗?

5. 将私钥永久添加到ssh-add中:

首先需要知道,ssh-agent在windows下的git bash中不是随窗口打开自动启动的,那么我们首先就要将其设置为随git bash窗口自启动。

将以下代码内容复制写入 C:\\Users\<用户名>\.bashrc 文件中(默认不存在,需要自己创建),熟悉vim的童鞋也可以直接通过vim写入 .bashrc 文件。

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

在这里插入图片描述

完成之后,重新打开git bash 窗口,然后通过 ssh-add 命令添加私钥路径。此时你会发现,现在直接执行ssh-add命令也不会和之前一样报错“Cloud not open a connection to your authentication agent”了,因为git-agent已经默认随git bash 自启动了。如果现在关闭窗口,重新打开并使用 ssh-add -l 命令查看也会发现我们的私钥在列表中,使用ssh -T [email protected] 也可以连接成功了。

OK,到此我们就可以使用git bash免密的clone、pull 和push代码了。
希望各位同学 代码少写Bug,早日升职加薪。


参考:

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent
https://docs.github.com/en/authentication/connecting-to-github-with-ssh/working-with-ssh-key-passphrases

你可能感兴趣的:(运维,git,ssh,github,gitee,windows)