需求场景

大部分开发者个人的代码基本都同步在代码托管平台管理,业内著名的有github、gitlab等,国内也有开源中国的码云(gitee)平台、coding.net平台。有时候,想玩一些有趣的东西,比如用流行的 CMS 搭建一套自己的博客系统(比如 Wordpress),而这些 CMS 都支持在线更新功能、打补丁 fix bug,增加一些合适的插件等。这样我们可以直接在管理后台选择更新系统,而无需先下载到本地,再通过FTP等方式上传到服务器重新部署。

我们喜欢用一些免费的云服务,但都有时长限制,说不定哪天就把我们的服务干掉了,毕竟免费的,服务稳定性不能保障。所以,这些云服务器只能运行代码,却不能做代码托管。于是,我们每次在线更新完功能之后,需要把代码备份到代码托管平台。

一般情况下,我们会单独生成一个 ssh key 公钥用于备份数据,而不是和其他公钥混合使用,避免因为因为某些操作不安全,造成代码丢失。当然你也可以选择一个其他账户操作也是可以的,但如果选择其他账户了,也就没有这篇文章的存在了。还是回到多个 ssh key 的问题上,默认情况下,RSA 算法的 ssh 私钥文件名为id_rsa,我们可以通过ssh-keygen生成公钥的时候可以指定其名称,假如指定的文件名称为:id_gitee_rsa

我们在当前用户目录的 .ssh 目录下面可以执行 ls 命令可以查看:

1
ls -la ~/.ssh/

bash 窗口显示如下:

1
2
3
4
5
6
7
drwx------ 2 www www 4096 May 29 14:51 .
drwxr-xr-x 5 www www 4096 Jun 28 18:53 ..
-rw------- 1 www www 1766 May 29 14:51 id_gitee_rsa
-rw-r--r-- 1 www www 398 May 29 14:51 id_gitee_rsa.pub
-rw------- 1 www www 1679 Oct 26 2018 id_rsa
-rw-r--r-- 1 www www 399 Oct 26 2018 id_rsa.pub
-rw-r--r-- 1 www www 666 Nov 14 14:39 known_hosts

切换SHH KEY

SSH 默认只会读取当前用户目录下 ~/.ssh/id_rsa 的数据,如果我们不切换 ssh key,假如我们在 github 或者 gitee 配置的是id_gitee_rsa的公钥,当 push 代码的时候回有如下错误提示:

1
2
3
4
5
Access deined: DeployKey does not support push code
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

所以,为了让 ssh 能识别其他私钥,需要将其添加到 ssh agent:

1
ssh-add ~/.ssh/id_gitee_rsa

如果ssh-add过程报错:Could not open a connection to your authentication agent.。则需要先执行bash代理。

1
ssh-agent bash

执行上面的代理配置命令后,再次执行 ssh-add ~/.ssh/id_gitee_rsa命令将其添加到 ssh 代理中。需要注意的是,如果在生成私钥的过程中输入了密码,那么该操作就需要再次输入密码授权。

1
Enter passphrase for /home/www/.ssh/id_gitee_rsa: 

如果出现上面的信息,则需要输入密码。输入密码无误,则切换成功后,会显示如下信息:

1
dentity added: /home/www/.ssh/id_gitee_rsa (/home/www/.ssh/id_gitee_rsa)

PUSH 代码

当 ssh key 切换成功之后,我们再次推送代码到我们的代码仓库,发现已经没有原来的错误了:

1
2
3
4
5
6
7
8
9
$ git push
Counting objects: 4098, done.
Compressing objects: 100% (3944/3944), done.
Writing objects: 100% (4098/4098), 40.11 MiB | 132.00 KiB/s, done.
Total 4098 (delta 941), reused 0 (delta 0)
remote: Resolving deltas: 100% (941/941), completed with 727 local objects.
remote: Powered by GITEE.COM [GNK-3.8]
To git@gitee.com:joyven/xxx.git
6893b33..85b567d4 master -> master