• 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 "xxxx@xxx.com"
    
    • 1

    其中,
    -t 用于指定创建的秘钥对的签名算法。
    -C 后面输入自己的邮箱作为注释,这里的邮箱只是用来生成sshkey中公钥的注释,方便确定这个公钥是用在哪的,你也可以输入其他的任意内容,只要可以方便日后辨认这个公钥即可。它并不会作为我们提交代码时识别身份的ID等凭证(身份信息需要通过git config命令进行配置)。
    在这里插入图片描述

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

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

    在这里插入图片描述

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

    登录自己的github或gitee,在个人设置中找到“安全设置”–“ssh公钥”。这里以Gitee为例进行展示,github的操作与之类似:
    在这里插入图片描述

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

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

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

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

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

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

    对于使用默认密钥对名称的小伙伴,此时就可以通过 ssh -T git@gitee.com 命令(github的测试命令为ssh -T git@github.com)进行测试(首次测试,会问你是否将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 git@gitee.com 命令查看连接时的日志信息:

    在这里插入图片描述

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

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

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

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

    再次使用 ssh -T git@gitee.com 命令测试就发现可以连通了。

    在这里插入图片描述

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

    在这里插入图片描述

    ……

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

    太天真了,好事多磨呀。

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

    在这里插入图片描述

    这是因为之前的操作只在之前的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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    在这里插入图片描述

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

    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

  • 相关阅读:
    SpringCloudAlibaba的nacos控制台不断输出日志
    CentOS7 Soft RoCE v2
    Util应用框架基础(三) - 面向切面编程(AspectCore AOP)
    爬虫模块—每日行情数据/交易日期/公司信息获取(01)
    Windows 10压缩卷参数错误怎么办?
    Prometheus采集Java程序指标信息
    VUE(递归)语法没错,但报 ESLint: ‘formatToTree‘ is not defined.(no-undef)
    张良计诉园子侵权案一审结束:需7天内证明转载博文是用户发布
    计算机毕业设计Java毕业生导师双选系统(源码+系统+mysql数据库+lw文档)
    postman和node.js的使用、YApi 新版如何查看 http 请求数据
  • 原文地址:https://blog.csdn.net/weixin_43863487/article/details/126276207