如何在一台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里面
配置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账号了,是不是很方便!