一台电脑多个(N个)GitHub账号之ssh通信基本原理

如果你有在同一个Git平台,不管是GitHub还是gitee还是自建,需要用到多个账号的时候,不妨来看下哟。

准备工作

登录两个GitHub账号,然后先把里面的添加的ssh秘钥删掉,然后在尝试通过ssh克隆,就会出现下面没有权限的错误,必然的。
Cloning into '你的仓库名称'...
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

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

在这里,我直接用我真实的两个GitHub用户为例,分别如下:

GitHub用户名邮箱github地址
yaimeetyaimeet@126.comhttps://github.com/yaimeet
ittlrittlr@ittlr.comhttps://github.com/ittlr

开始 进入.ssh目录

首先进入 .ssh 目录,因为下面的操作算是非常规,后面会解释。

Linux 和 Mac 直接打开终端,输入 cd ~/.ssh/
Windows ,打开你的 GitBash 命令行工具,输入 cd ~/.ssh/

如果你是新电脑,从来没有操作过 ssh ,那么你可能连 .ssh 目录都没有,这种情况下执行以下命令:

cd ~ && mkdir .ssh && cd .ssh

第1步 生成每个账号的公钥和私钥

这里先生成 账号 yaimeet

ssh-keygen -t rsa -C 'yaimeet@126.com'

输入完之后,会给你提示输入名称什么的,我们只在第一个提示(如下)的时候,输入 id_rsa_yaimeet ,如果不输入默认是 is_rsa ,这里既然是解决多账号,那么我们就干脆全部区分开。

Enter file in which to save the key :输入 id_rsa_yaimeet

然后一路回车,啥也不要输入了。

接着如法炮制,把这个步骤再执行一遍,用第二个账号以及邮箱,同样操作一遍,然后 执行 ll ,会看到如下四个文件:

-rw-------  1 yaimeet  staff   1.8K 11 27 22:20 id_rsa_yaimeet
-rw-r--r--  1 yaimeet  staff   397B 11 27 22:20 id_rsa_yaimeet.pub
-rw-------  1 yaimeet  staff   1.8K 11 27 22:20 id_rsa_ittlr
-rw-r--r--  1 yaimeet  staff   397B 11 27 22:20 id_rsa_ittlr.pub

每个账号都会生成两个文件:公钥(带.pub后缀)和私钥(不带后缀),这两个文件的作用是什么呢?

私钥是在用 ssh 和远端通信的时候,会用 私钥 把你的信息加密传输给远端,远端通过 公钥 再进行解密,所以这就是为什么我们要把 公钥 的内容添加到我们所使用的 git 平台的个人 ssh key 中的原因。

第2步 把公钥添加到GitHub

把上面生成的两个账号的公钥(带.pub)的文件的内容,添加到GitHub对应账号的 ssh key 中,查看公钥文件内容执行如下命令:

cat id_rsa_yaimeet.pub # 查看 yaimeet 账号的公钥
cat id_rsa_ittlr.pub # 查看 ittlr 账号的公钥

拿每个账号的公钥的内容添加到GitHub上,添加上之后,可以看到下图左边的钥匙的颜色是灰色的,代表还没有使用过:

第3步 增加 ssh 配置文件

同样,还是在 .ssh 目录下执行 vim config 创建 config 文件,写入如下内容:

# 第1个GitHub账户 yaimeet
Host yaimeet.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_yaimeet
User yaimeet


# 第2个GitHub账户 ittlr
Host ittlr.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_ittlr
User ittlr

这个文件可能很少有人会用到,作用是啥呢?

如果没有这个文件,当你执行 ssh 通信的时候,会自动用 id_rsaid_rsa.pub 作为公钥和私钥来处理,这也就是一个账号的时候,生成公钥私钥执行 ssh-keygen 的时候,啥都不用输的原因。

OK,那再解释一下这个文件的几个字段定义:

  • Host # 给远程主机定义别名
  • HostName # 远程主机,例如: github.com
  • PreferredAuthentications # 认证方式,Git的ssh通常默认就是公钥:publickey
  • IdentityFile # 使用的私钥 既然是多用户,那肯定要手工指定
  • User # 你的用户名

注意:这里面的 Host 特别重要,这个将要影响我们后面操作 git 的方式。

因为后面再操作 git 命令的时候,比如:

git clone git@github.com:yaimeet/vue-editor-md.git

要改成:

git clone git@yaimeet.github.com:yaimeet/vue-editor-md.git
看到这里,大概就明白了,给远程主机换个别名,通过 给ssh 配置指定 主机别名,公钥和私钥以及用户等信息。

第4步 ssh 测试配置文件

测试一下通信是否OK?

执行如下命令测试 yaimeet:

ssh -T git@yaimeet.github.com

输出:Hi yaimeet! You've successfully authenticated, but GitHub does not provide shell access.

执行如下命令测试 ittlr:

ssh -T git@ittlr.github.com

输出:Hi ittlr! You've successfully authenticated, but GitHub does not provide shell access.

看到没,远端会告诉你,成功授权,如果这里失败了,那么后面就不需要尝试了,检查下前面是不是哪里出现了错误。

第5步 实践见证奇迹

注意,下面的操作不要跟着,因为你需要换成你自己

克隆 yaimeet 的项目,如下图:

这个时候,你再看你 github 上秘钥的状态,颜色就变了:

克隆 ittlr 的项目,如下图:

最终的命令其实就是:git clone git@用户主机别名:git用户名/仓库名.git

如果你想进一步确定,可以看到 git 仓库下配置文件:

到这里基本就OK了,不信再继续看?

Git用户信息局部配置

默认我们都是用下面的全局命令配置:

git config --global user.name '用户名'
git config --global user.email '用户邮箱'

现在,既然是多个账号,那么肯定就要局部化,进入项目目录,执行:

git config user.name '这个仓库的用户名'
git config user.email '这个仓库的用户邮箱'

通过设置局部信息,来在操作的时候覆盖全局信息。

这块如果嫌麻烦,其实可以自己写个脚本,快捷操作,有空补上。

修改本地已有仓库

进入你的仓库根目录,执行 vim .git/config ,找到类似下面的信息:

[remote "origin"]
    url = git@github.com:yaimeet/vue-editor-md.git
    fetch = +refs/heads/*:refs/remotes/origin/*

改成如下:

[remote "origin"]
    url = git@用户主机别名:用户名/仓库名.git
    fetch = +refs/heads/*:refs/remotes/origin/*

url 后面的地址按照上面改下主机名即可。

或者 你也可以用命令行执行,效果一样,执行下面的命令:

git remote rm origin
git remote add origin git@用户别名主机:yaimeet/vue-editor-md.git

总结注意事项

  • 通过 ssh 配置文件,给主机定义别,指定对应的 公钥私钥等信息
  • 操作远端的时候,主机名要换成别名,不管是克隆,还是执行git remote add xxxx的时候,都要注意下。

小技巧

既然是定义主机别名,那么别名也可以起个短点的名字,比如就叫你的用户名,那么你操作的时候,你的主机名就更短了,这个看个人喜好,不冲突就好,哈哈哈。

参考链接

Last modification:December 1st, 2019 at 01:08 am
如果觉得我的文章对你有用,请随意赞赏

Leave a Comment