在从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
)等,希望可以帮到有需要的同学。
废话完毕,开始操作。
在windows下,需要先安装 git 工具。安装完成后,就可以在鼠标右键菜单中找到“Git Bash Here”。点击进入 git bash 命令行窗口。
在命令行窗口中输入 ssh-keygen
命令创建ssh密钥对:
ssh-keygen -t ed25519 -C "xxxx@xxx.com"
其中,
-t
用于指定创建的秘钥对的签名算法。
-C
后面输入自己的邮箱作为注释,这里的邮箱只是用来生成sshkey中公钥的注释,方便确定这个公钥是用在哪的,你也可以输入其他的任意内容,只要可以方便日后辨认这个公钥即可。它并不会作为我们提交代码时识别身份的ID等凭证(身份信息需要通过git config
命令进行配置)。
根据提示,可以分别指定密钥对的保存路径和名称,也可以直接使用密钥的默认名称(id_ed25519)。然后指定秘钥对的密码,如果想设置就输入密码,不想设置则直接回车即可。
到此,我们的秘钥对就生成了,可以在自己指定的路径或默认的 C:\\Users\用户名\.ssh\
目录下查看。公钥(Gitee.pub)的内容是可以公开的,我们之后会将其出示给github/gitee。私钥(Gitee)内容则需要自己保存,不要泄露给他人。
登录自己的github或gitee,在个人设置中找到“安全设置”–“ssh公钥”。这里以Gitee为例进行展示,github的操作与之类似:
在网页中,给公钥输入一个名称(随意起名,不过最好能区分出你的登录设备),然后在电脑中使用文本工具打开前面创建的公钥(Gitee.pub)复制其中的内容,粘贴到“公钥”一栏中。点击“确定”。
至此,gitee上的公钥就配置好了。
重点来了,公钥配置好了,私钥在我们本地,那么按理说我们就可以在本机与远程通信了。但是,越到最后越容易出问题。这里需要分两种情况进行讨论:
创建密钥对时使用默认名称(以id_开头);
创建密钥对时自定义密钥对名称。
对于使用默认密钥对名称的小伙伴,此时就可以通过 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_
开头的,而不会去搜索我们自定义名称的私钥,所以也就无法认证成功与远程建立连接了。
既然如此,我们就要将自定义名称的私钥自己加到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 就要手动添加私钥吗?
首先需要知道,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 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