多个GitHub帐户和SSHconfiguration
我遇到了一些麻烦,让两个不同的SSH密钥/ GitHub帐户一起玩。 我有以下设置:
使用git@github.com:accountname
可从一个帐户访问Repos
Repos使用git@github.com:anotheraccount
从另一个帐户访问
每个帐户都有自己的SSH密钥。 两个SSH密钥都被添加了,我创build了一个configuration文件。 我不相信configuration文件是正确的。 我不太清楚如何指定使用git@github.com:accountname
访问repos git@github.com:accountname
应该使用id_rsa
和git@github.com:anotheraccount
应该使用id_rsa_anotheraccount
。
安迪·莱斯特的回答是准确的,但是我发现了一个重要的额外步骤,我需要使这个工作。 在试图build立两个configuration文件,一个为个人和一个为工作,我~/.ssh/config
大致如下:
Host me.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/me_rsa Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/work_rsa
我的工作configuration文件没有采取,直到我做了一个ssh-add ~/.ssh/work_rsa
。 之后,连接到github使用正确的configuration文件。 以前,他们默认第一个公钥。
对于使用ssh-add
时无法打开与身份validation代理的连接 ,
检查: https : //stackoverflow.com/a/17695338/1760313
我最近不得不这样做,不得不对所有这些答案和他们的意见进行筛选,最终把这些信息拼凑在一起,所以为了您的方便,我将把它放在一个post里。
第1步:SSH密钥
创build您需要的任何密钥对。 在这个例子中,我已经命名为默认/原始'id_rsa'(这是默认值)和我的新'id_rsa-work':
ssh-keygen -t rsa -C "stefano@work.com"
第2步:sshconfiguration
通过创build/修改〜/ .ssh / config来设置多个sshconfiguration文件。 请注意略有不同的“主机”值:
# Default GitHub Host github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa # Work GitHub Host work.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_work
第3步:ssh-add
你可能也可能不需要这样做。 要检查,通过运行列出身份指纹:
$ ssh-add -l 2048 1f:1a:b8:69:cd:e3:ee:68:e1:c4:da:d8:96:7c:d0:6f stefano (RSA) 2048 6d:65:b9:3b:ff:9c:5a:54:1c:2f:6a:f7:44:03:84:3f stefano@work.com (RSA)
如果您的input不在那里然后运行:
ssh-add ~/.ssh/id_rsa_work
第四步:testing
为了testing你做的这一切都正确,我build议以下快速检查:
$ ssh -T git@github.com Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T git@work.github.com Hi stefano! You've successfully authenticated, but GitHub does not provide shell access.
请注意,您必须根据您要使用的密钥/身份来更改主机名(github / work.github)。 但现在你应该很好走! 🙂
比方说, alice
是一个github.com用户,拥有2个或更多私人存储库。 对于这个例子,我们将只使用两个名为repo1
和repo2
存储库
https://github.com/alice/repo1
https://github.com/alice/repo2
您需要从这些存储库中提取数据,而不必在服务器或多台服务器上input密码。 例如,你想要执行git pull origin master
,而且你希望在不需要密码的情况下发生这种情况。
你不喜欢和ssh-agent打交道,你已经发现了(或者你正在发现) ~/.ssh/config
一个文件,让你的ssh客户端根据主机名和用户名知道使用哪个私钥,简单的configuration条目看起来像这样:
Host github.com HostName github.com User git IdentityFile /home/alice/.ssh/alice_github.id_rsa IdentitiesOnly yes
所以你继续创build你的(alice_github.id_rsa, alice_github.id_rsa.pub)
密钥对,然后你也去了你的仓库的.git/config
文件,并且你修改了你的远程origin
的URL是这样的:
[remote "origin"] url = "ssh://git@github.com/alice/repo1.git"
最后,你去了存储库Settings > Deploy keys
部分,并添加了alice_github.id_rsa.pub
的内容
在这一点上,你可以做你的git pull origin master
而不用input密码没有问题。
但是第二个存储库呢?
所以你的直觉就是抓住这个键并把它添加到repo2
的Deploy键中,但是github.com会报错,并告诉你键已经被使用了。
现在你去生成另一个密钥(使用ssh-keygen -t rsa -C "alice@alice.com"
,当然没有密码),这样就不会变得乱七八糟,你现在可以这样命名你的密钥:
-
repo1
:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
-
repo2
(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
现在你将在github.com上把新的公钥放在repo2
的部署密钥configuration上,但是现在你有一个ssh问题需要处理。
如果仓库托pipe在同一个github.com
域,ssh如何能告诉哪个关键?
你的.ssh/config
文件指向github.com
,它不知道在执行pull时使用哪个键。
所以我find了github.com的一个窍门。 你可以告诉你的SSH客户端,每个版本库位于不同的github.com子域,在这种情况下,它们将是repo1.github.com
和repo2.github.com
所以首先要编辑你的repo克隆上的.git/config
文件,所以它们看起来像这样:
对于repo1
[remote "origin"] url = "ssh://git@repo1.github.com/alice/repo1.git"
对于repo2
[remote "origin"] url = "ssh://git@repo2.github.com/alice/repo2.git"
然后,在你的.ssh/config
文件中,现在你将能够input每个子域的configuration:)
Host repo1.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa IdentitiesOnly yes Host repo2.github.com HostName github.com User git IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa IdentitiesOnly yes
现在,您可以在不input任何密码的情况下将git pull origin master
出来。
如果你有多台机器,你可以将密钥复制到每台机器上,然后重新使用它们,但是我build议你做好每台机器和每台机器生成1个密钥的工作。 你将会有更多的钥匙可以处理,但是如果一个人受到威胁,你的脆弱性就会降低。
在~/.ssh/config
使用IdentityFile
参数:
Host github.com HostName github.com IdentityFile ~/.ssh/github.rsa User petdance
我在github上有两个帐户,这是我做的(在linux
)使其工作。
按键
- 创build2对RSA密钥,通过
ssh-keygen
,正确命名它们,使生活更轻松。 - 通过
ssh-add path_to_private_key
将私钥添加到本地代理 - 对于每个github账户,上传一个(不同的)公钥。
组态
的〜/ .ssh /configuration
Host github-kc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_kc.pub # LogLevel DEBUG3 Host github-abc Hostname github.com User git IdentityFile ~/.ssh/github_rsa_abc.pub # LogLevel DEBUG3
设置回购的远程URL:
- 对于主机
github-kc
回购:
git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- 对于主机
github-abc
回购:
git remote set-url origin git@github-abc:abcdefg/yyy.git
释
~/.ssh/config
选项:
-
Host
github- <identify_specific_user>
主机可以是任何可以识别主机加上帐户的值,它不需要成为真正的主机,例如github-kc
在我的本地笔记本电脑上在github上标识我的帐户之一,当为git repo设置远程URL时,这是
git@
之后的值,这就是repo映射到主机的方式,例如git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
- [以下是
Host
子选项] -
Hostname
指定实际的主机名,只需使用github.com
作为github, -
User
git
用户总是git
的github, -
IdentityFile
指定要使用的密钥,只需将path设置为公钥, -
LogLevel
指定日志级别进行debugging,如果有任何问题,DEBUG3
给出了最详细的信息。
在我的情况下,上述解决scheme都没有解决我的问题,但ssh代理。 基本上,我做了以下几点:
-
使用下面显示的ssh-keygen生成密钥对。 它会生成一个密钥对(在这个例子中
.\keyfile
和.\keyfile.pub
)ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile
-
将
keyfile.pub
上传到git提供程序 - 在你的机器上启动ssh-agent(你可以用
ps -ef | grep ssh-agent
检查它是否已经运行) - 运行
ssh-add .\keyfile
添加凭据 - 现在你可以运行
git clone git@provider:username/project.git
我用了,
Host github.com HostName github.com IdentityFile ~/.ssh/github_rsa User abc@gmail.com
它被罚款。
在你的.ssh / config文件中使用上面的设置来获得不同用户名的不同rsa密钥。
作为@stefano答案的补充,当为另一个帐户生成新的SSH密钥时,最好使用带-f
命令,
ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"
由于id_rsa_work
文件不存在于path~/.ssh/
,我手动创build这个文件,并且它不工作:(
我使用shell脚本将我切换到任何我想要“活跃”的帐户。 本质上,你从一个新的开始,让一个帐户configuration正确,工作,然后将这些文件移动到一个正确的前缀名称。 从此,您可以使用命令“github”或“gitxyz”来切换:
# my github script cd ~/.ssh rm id_rsa rm id_rsa.pub rm config ln git_dhoerl id_rsa ln git_dhoerl.pub id_rsa.pub ln config_dhoerl config git config --global user.email "dhoerl@xyz.com" git config --global github.user "dhoerl" # git config --global github.token "whatever_it_is" # now unused ssh-add -D
我已经很幸运了。 我也在Xcode中创build了一个运行脚本(对于你的Mac用户),所以除非我有适当的设置(因为它使用git),否则不会构build我的项目:
运行放置在依赖关系之后的脚本:
#! /bin/ksh if [ "$(git config --global --get user.email)" != "dhoerl@<company>.com" ] then exit 1 fi
我花了很多时间来了解所有的步骤。 所以让我们一步一步描述:
- 使用
ssh-keygen -t rsa
创build新的身份文件。 给它一个像proj1.id_rsa
的替代品,毫无疑问,因为你不需要密码。 -
在
.ssh/config
添加新的部分:Host proj1.github.com
HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/id_rsa_proj1
考虑到第一部分,并注意proj1.github.com
我们将回到后面的部分。
- 将身份添加到ssh代理
ssh-add ~/.ssh/proj1_id_rsa
- 这是我第一次
proj1.github.com
了 – 现在当你想克隆一个proj1回购你使用proj1.github.com
(确切地说是主机从configuration文件)。git clone git@proj1.github.com
。
一个很好的教程。
不要搞乱主机