前言

使用 Github Page 部署个人博客后便知道,当我们用「用户名.github.io」作为仓库名时,再将 public 文件推至该 Github 仓库,便可得到一个形为「用户名.github.io」的网址。显然,这种仓库名在一个 Github 账号中只能存在一个,故而一个账号只能得到一个这样的网址。😑

由于我之前花了大量精力鼓弄了一个 Hexo 框架,主题为 Next 的博客,因加入了许多花里胡哨但却并没必要的功能,网站打开速度慢,这也是我转而使用 Hugo 框架的原因 。我既不想放弃魔改已久的博客,又不想网址太丑(绑定个人域名可以避免这点),于是干脆新申请了个 Github 账号用以配合 Hugo 搭建个人博客。🙃

但这时便面临问题,一方面仍执着于鼓弄 Next 主题新功能,另一方面还得向 Hugo 所在的 Github 仓库上传更新文件,而且两个博客都是通过默认的 HTTPS 的方式上传文件,HTTPS 输入账号密码后会默认保存,这就导致电脑登陆 Github 时可能会错位,即可能使用了账号一的密码去登陆账号二。

针对这种情况有一种解决方法:在想切换登陆账号二时,删去已保存的 Github 账号一的用户名和密码,接着再输入账号二的用户名和密码。

删去方法如下:

在以下路径找到 Github 的 Windows 凭据,直接删除即可。

Windows凭据

显然这样的操作极为麻烦,倘若能通过 SSH 分别匹配好一个账号,那就能免去每次输入账号密码的麻烦过程了[1]😎。

先来看看如何使用 SSH:

单账号

首先执行下行命令生成 SSH 密钥对:

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

将上面的邮箱地址改为你自己在 GitHub 上的邮箱地址。如果你是第一次生成的话,一路回车即可(口令 passphrase 非必须)。若遇到需回答「 yes or no ?」,键入 yes并回车即可。

这样就会在C盘用户目录下生成.ssh文件夹,其中包含了 id_rsa 和 id_rsa.pub 这两个文件,前者是私钥,后者是公钥,用记事本打开 id_rsa.pub,复制其中的全部内容,再去 GitHub 上 设置 一个 New SSH key,标题随意起,最后粘贴公钥即可。这样本地的 id_rsa 密钥就可以和 GitHub上的 id_rsa.pub 公钥进行配对,授权成功。

然后添加远程仓库关联:

$ git remote add origin git@github.com:Nimnahc2020/myblog.git

注:如果你之前通过git remote add 添加了 Github 仓库的 HTTPS 地址[2],那么需要修改仓库的远程仓库链接地址为 SSH 地址,在本地仓库文件中打开 git bash,键入如下命令:

$ git remote set-url origin git@github.com:Nimnahc2020/myblog.git

git@github.com:Nimnahc2020/myblog.git换为你仓库的 SSH 地址即可。

SSH

此外,当你本地第一次连接 GitHub 的服务器时,可能会有警告信息,键入 yes 并回车即可。

多账号

同单账号一样,先得到两组密钥对,邮箱分别对应两个账号:

# 帐号一
ssh-keygen -t rsa -b 4096 -C "your_email@example_one.com"

# 帐号二
ssh-keygen -t rsa -b 4096 -C "your_email@example_two.com"

这里注意,当看到提示:

Enter file in which to save the key (/home/archie/.ssh/id_rsa): 

修改一下默认的 id_rsa,建议在后面加上你的 GitHub 用户名,比如修改为 id_rsa_nimnahc。或者直接进入.ssh 文件夹修改相应文件名称,如id_rsa_nimnahcid_rsa_nimnahc.pub

通过上述操作,我得到id_rsa_nimnahcid_rsa_willcai两份密钥。

然后,执行下面三行命令,将生成的两个密钥添加到 ssh-agent:

$ eval "$(ssh-agent -s)"
$ ssh-add ~/.ssh/id_rsa_nimnahc
$ ssh-add ~/.ssh/id_rsa_willcai

接下来,在.ssh文件夹内添加一个 config 文件来配置 SSH:

$ touch config

输入以下内容(自行修改 hostIdentityFile

Host WillCAI2020.github.com
        HostName github.com
		User git
        IdentityFile ~/.ssh/id_rsa_willcai

Host Nimnahc2020.github.com
        HostName github.com
		User git
        IdentityFile ~/.ssh/id_rsa_nimnahc

类似的,添加或修改相应仓库的远程仓库链接地址:

# 帐号一
$ git remote add origin git@WillCAI2020.github.com:WillCAI2020/blog-hexo.git
$ git remote set-url origin git@WillCAI2020.github.com:WillCAI2020/blog-hexo.git

# 帐号二
$ git remote add origin git@Nimnahc2020.github.com:Nimnahc2020/myblog.git
$ git remote set-url origin git@Nimnahc2020.github.com:Nimnahc2020/myblog.git

注意:主机名分别是 Willcai2020.github.comNimnahc2020.github.com,而不再是默认的 github.com 了,以后克隆仓库时也要注意:修改为帐号的相应主机名。

最后,将相应的公钥添加到你相应的 GitHub 帐号即可。

可通过如下命令验证是否成功:

$ ssh -T git@WillCAI2020.github.com
$ ssh -T git@Nimnahc2020.github.com

若出现如下提示:

Hi WillCAI2020! You've successfully authenticated, but GitHub does not provide shell access.

即表示与远程仓库公钥匹配成功。🎉🍾🥂

后语

本打算通过这个方式实现免密分别部署的,但发现 hexo 并未达到预想效果,在hexo d后报错git@github.com: Permission denied (publickey),但倘若通过 Git 命令提交 public 文件,却可以实现提交。🤔

因而部署hexo我仍然使用 HTTPS 地址,而提交 Hugo 原码时我便通过 SSH 地址实现免登陆提交,这算是一种折中的方案吧。🙃

参考文章

  1. GitHub Help | 关于SSH
  2. GitHub Issues | 同一台电脑配置多个 git 账号
  3. CSDN | 解决 remote: Permission to userA/repo.git denied to userB
  4. reuixiy | 使用 SSH 连接到 GitHub(多帐号)

  1. SSH 与 HTTPS 的区别及介绍可浏览这篇文章↩︎

  2. 可通过浏览本地仓库 .git文件下的 config 文件来确认地址。 ↩︎

Q.E.D.

本文由 ruchan 创作,如果您觉得本文不错,请随意赞赏
采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
本文链接:https://crcrc.cn/archives/ssh-githubs
最后更新于:2021-08-15 14:15:11


Not afraid of the future, not thinking of the past.