如何在一台Linux主机上同时访问多个Github账户

想必很多程序员都遇到过下面这个Github最著名报错,本文就将简要介绍以下针对这个报错的终极解决方案。

“ERROR: Permission to xxx.git denied to XXX”

ERROR: Permission to hbxn740150254/BestoneGitHub.git denied to Chenzuohehe. 
fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.

当你遇到上述问题的时候,解决方法是要重新生成一个SSH KEY

生成SSH KEY

//先进入本地ssh目录
AppledeiMac:~ Apple$ cd ~/.ssh
//查看当前已有的密钥文件
AppledeiMac:.ssh Apple$ ls
id_rsa        id_rsa.pub  known_hosts
//生成密钥
AppledeiMac:.ssh Apple$ ssh-keygen -t rsa -C "iMac_personnal_publicKey"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/Apple/.ssh/id_rsa):               
/Users/Apple/.ssh/id_rsa_personal
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/Apple/.ssh/id_rsa_personal.
Your public key has been saved in /Users/Apple/.ssh/id_rsa_personal.pub.
The key fingerprint is:
SHA256:1gepuxDHwJRnFbKvc0Zq/NGrFGE9kEXS06jxatPPrSQ iMac_personnal_publicKey
The key's randomart image is:
+---[RSA 2048]----+
|      ....=*oo   |
|     o. ooo=+ .  |
|      oo. =+o.   |
|       o =.o..   |
|      . S =o.    |
|       = =++.    |
|      . B.=.Eo.. |
|       o B . +o .|
|          . o.. .. |
+----[SHA256]-----+
//再次查看密钥文件,可以看到刚刚添加的密钥文件已经生成了
AppledeiMac:.ssh Apple$ ls
id_rsa            id_rsa_personal     known_hosts
id_rsa.pub        id_rsa_personal.pub

SSH是什么?他是一种远程登录服务,登录后连接到服务器的终端上,然后就可以进行相关的操作了。Github服务器也支持ssh登录(当然只给你控制仓库上传和下载)。

第一步,就是要生成私钥和公钥密钥对,这是一种加密方式,它给出一对密码,私钥加密,公钥可以解密,公钥加密,私钥可以解密,其中,公钥是可以公开发行的,别人用你的公钥加密了数据,这个密文数据发给你,你就能用私钥进行解密。然后你拿到对方的公钥,同样的步骤,你就可以发加密后的信息给他。这就达成了加密通信。理论上是很难破解的,只要你藏好私钥。

ssh-keygen命令会生成一对秘钥,在Linux中一般是放在~/.ssh/目录下面。秘钥文件是一个文本文件,可以打开读取。把公钥内容复制粘贴到服务器上面,服务器就拥有你的公钥了。

创建密钥对会让你输入私钥的名字:比如id_rsa是私钥,id_rsa.pub就是公钥。

但是,如果你有很多对秘钥,服务器怎么知道你要用哪个呢?答案在第三步。

将公钥添加到Github的SSH keys里面

打开新生成的~/.ssh/id_rsa_personal.pub文件,复制里面的内容,然后将内容添加到GitHub上SSH keys里面 Github-SSH-Key

配置SSH config文件

没有config文件则创建一个,终端输入touch config,创建完以后用vim或者任何一个编辑器打开。

在不影响默认的github设置下我们重新添加一个Host,建一个自己能辨识的github别名,我取的是github-personal,新建的帐号使用这个别名做clone和更新动作。或者直接复制代码添加到已有的config文件里面,添加之后的样子请参考下面的内容。

#Default GitHub
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa

Host github-personal
HostName github.com
User git
IdentityFile ~/.ssh/id_rsa_personal

用新的Host别名来访问Github

将GitHub SSH仓库地址中的git@github.com替换成新建的Host别名

如原地址是git@github.com:hbxn740150254/BestoneGitHub.git替换后应该是:github-personal:hbxn740150254/BestoneGitHub.git 或者 git@github-personal:hbxn740150254/BestoneGitHub.git,经过亲自测试,都是可以的。

如果是新建的仓库,直接使用替换后的URL clone即可。如果已经使用原URL Clone过了,可以使用命令修改:

//进入项目文件夹目录
AppledeiMac:.ssh Apple$ cd /Users/Apple/Desktop/BestoneDemo 
//修改之前
Apple$ git remote -v
github git@github.com:hbxn740150254/BestoneGitHub.git (fetch)
github git@github.com:hbxn740150254/BestoneGitHub.git (push)
//修改 remote set-url
AppledeiMac:BestoneDemo Apple$ git remote set-url origin  github-personal:hbxn740150254/BestoneGitHub.git
//验证是否修改成功    
//使用修改后的github-personal SSH连接,连接成功用户是hbxn740150254,此时公钥是id_rsa_personal
AppledeiMac:BestoneDemo Apple$ ssh -T github-personal
Hi hbxn740150254! You've successfully authenticated, but GitHub does not provide shell access.
//使用默认的git@github.com SSH去连接,连接成功用户是FaxeXian,此时公钥是id_rsa
AppledeiMac:.ssh Apple$ ssh -T git@github.com
Hi FaxeXian! You've successfully authenticated, but GitHub does not provide shell access.
//修改之后
AppledeiMac:BestoneDemo Apple$ git remote -v
github github-personal:hbxn740150254/BestoneGitHub.git (fetch)
github github-personal:hbxn740150254/BestoneGitHub.git (push)

如果github账户如果还是显示之前id_rsa密钥账户的话,请把你的密钥加入sshAgent代理中

apple:.ssh apple$ eval "$(ssh-agent -s)"
Agent pid 19795
//添加密钥 id_rsa_personal
apple:.ssh apple$ ssh-add id_rsa_personal
Identity added: id_rsa_personal (github-personal)
//添加默认密钥 id_rsa
apple:.ssh apple$ ssh-add id_rsa
//密钥有密码的话就会要你提示输入 passphrase
Enter passphrase for id_rsa: 
//测试用密钥isa是否连接成功github
apple:.ssh apple$ ssh -T git@github.com
Hi hbxn740150254! You 've successfully authenticated, but GitHub does not provide shell access.
//测试密钥id_rsa_personal是否连接成功github
apple:.ssh apple$ ssh -T git@github-personal
Hi FaxeXian! You've successfully authenticated, but GitHub does not provide shell access.

至此,你就可以在这一台电脑上通过两个公钥来分别访问不同的Github账号了,是不是很方便!