Multiple GitHub Accounts & SSH Config
我很难让两个不同的ssh密钥/github帐户一起玩得很好。我有以下设置:
使用
使用
每个帐户都有自己的ssh密钥。两个ssh密钥都已添加,我已经创建了一个配置文件。不过,我不相信配置文件是正确的。我不太确定如何指定使用
安迪·莱斯特的回答是准确的,但我发现了一个重要的额外步骤,我需要做才能使这一点发挥作用。在试图建立两个配置文件时,一个用于个人,一个用于工作,我的
1 2 3 4 5 6 7 8 9 | 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 |
直到我做了一个
对于在使用
我最近不得不这样做,并且必须筛选所有这些答案和他们的评论,最终将这些信息拼凑在一起,因此为了您的方便,我将把它们放在一个帖子中:
步骤1:ssh密钥创建您需要的任何密钥对。在这个例子中,我将自己命名为默认/原始的"id_rsa"(这是默认值)和新的"id_rsa-work":
1 | ssh-keygen -t rsa -C"[email protected]" |
步骤2:ssh配置通过创建/修改~/.ssh/config设置多个ssh配置文件。请注意略有不同的"主机"值:
1 2 3 4 5 6 7 8 9 10 11 | # 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添加你可能需要也可能不需要这样做。要进行检查,请通过运行列出身份指纹:
1 2 3 | $ 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 [email protected] (RSA) |
如果您的条目不存在,请运行:
1 | ssh-add ~/.ssh/id_rsa_work |
步骤4:测试为了测试您是否正确完成了这些操作,我建议您进行以下快速检查:
1 2 3 4 5 | $ ssh -T [email protected] Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. $ ssh -T [email protected] Hi stefano! You've successfully authenticated, but GitHub does not provide shell access. |
请注意,您必须根据要使用的密钥/标识更改主机名(github/work.github)。但现在你该走了!:)
假设
您需要在不输入密码的情况下从这些存储库中提取,可能是在服务器上,也可能是在多个服务器上。例如,您希望执行
您不喜欢与ssh代理打交道,您已经发现(或者现在正在发现)了
1 2 3 4 5 | Host github.com HostName github.com User git IdentityFile /home/alice/.ssh/alice_github.id_rsa IdentitiesOnly yes |
因此,您继续创建了您的
1 2 | [remote"origin"] url ="ssh://[email protected]/alice/repo1.git" |
最后,您转到存储库
此时,您可以在不输入密码的情况下执行
因此,您的直觉是获取该密钥并将其添加到
现在,您开始生成另一个密钥(当然是使用不带密码的
repo1 键对:(repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub) 。repo2 键对:(repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub) 。
现在您将把新的公钥放在gethub.com上
你的
所以我在github.com上找到了一个技巧。您可以告诉ssh客户机,每个存储库都位于不同的github.com子域中,在这些情况下,它们将是
所以第一件事就是在你的repo克隆上编辑
对于RePO1
1 2 | [remote"origin"] url ="ssh://[email protected]/alice/repo1.git" |
对于RePO2
1 2 | [remote"origin"] url ="ssh://[email protected]/alice/repo2.git" |
然后,在您的
1 2 3 4 5 6 7 8 9 10 11 | 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 |
现在,您可以在不输入两个存储库中的任何密码的情况下使用
如果您有多台机器,您可以将密钥复制到每台机器上,然后重新使用它们,但是我建议您执行腿部工作,为每台机器和repo生成一个密钥。你将有更多的钥匙需要处理,但是如果有人受到威胁,你就不那么容易受到伤害。
我在Github上有两个账户,这是我(在
- 通过
ssh-keygen 创建2对rsa密钥,正确命名它们,使其更容易使用。 - 通过
ssh-add path_to_private_key 向本地代理添加私钥 - 对于每个github帐户,上载一个(不同的)公钥。
配置
~/.ssh/CONFIG
1 2 3 4 5 6 7 8 9 10 11 | 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 |
为repo设置远程URL:
对于主机
github-kc 中的repo:1git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git对于主机
github-abc 中的repo:1git remote set-url origin git@github-abc:abcdefg/yyy.git
解释
Host Github-
主机可以是任何可以标识主机和帐户的值,它不需要成为真正的主人,例如github-kc 确定我在Github的本地账户笔记本电脑,当为git repo设置远程URL时,这是放置在
git@ 之后的值,这就是repo映射到主机的方式,例如git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git 。- < BR>
- [以下是
Host 的子选项] Hostname
指定实际主机名,只需将github.com 用于github,User git
对于github,用户始终是git ,IdentityFile
指定要使用的密钥,只需将路径设置为公钥,LogLevel
指定要调试的日志级别(如果有问题),DEBUG3 提供最详细的信息。
使用
1 2 3 4 | Host github.com HostName github.com IdentityFile ~/.ssh/github.rsa User petdance |
我花了很多时间来理解所有的步骤。所以让我们一步一步地描述一下:
在
1 2 3 4 | Host proj1.github.com HostName github.com PreferredAuthentications publickey IdentityFile ~/.ssh/proj1.id_rsa |
考虑到第一部分,请注意,
一个好的教程。
别把主人搞砸了
在我的例子中,上面的解决方案都没有解决我的问题,但是ssh代理解决了。基本上,我做了以下工作:
使用ssh keygen生成密钥对,如下所示。它将生成一个密钥对(在本例中为
上传
编辑ssh配置文件(如所有其他答案中建议的那样)的一个可能更简单的替代方法是配置单个存储库以使用不同的(如非默认)ssh密钥。
在要使用其他密钥的存储库中,运行:
1 | git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount' |
并确保通过运行以下命令将密钥添加到ssh代理:
1 | ssh-add ~/.ssh/id_rsa_anotheraccount |
请记住,上面的命令只会为当前会话向ssh代理添加密钥。如果你想让它永远工作,你必须"永久"地将它添加到你的ssh代理中。例如,这是如何为Ubuntu和OSX做的。
还应该可以使用全局git配置和条件include将这种方法扩展到多个存储库(参见示例)。
作为对@stefano答案的补充,在为另一个帐户生成新的ssh密钥时,最好将命令与
1 | ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C"[email protected]" |
由于
我用过,
1 2 3 4 |
它很好。
在.ssh/config文件中对不同用户名的不同rsa密钥使用上述设置。
我使用shell脚本将我切换到我想要的"活动"帐户。基本上,您从新的开始,得到一个正确配置和工作的帐户,然后将这些文件移动到一个具有正确前缀的名称。从那时起,您可以使用命令"github"或"gitxyz"切换:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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"[email protected]" git config --global github.user"dhoerl" # git config --global github.token"whatever_it_is" # now unused ssh-add -D |
我在这方面运气很好。我还在Xcode中创建了一个运行脚本(对于Mac用户),这样它就不会构建我的项目,除非我有适当的设置(因为它使用了git):
运行位于依赖项之后的脚本:
1 2 3 4 5 | #! /bin/ksh if ["$(git config --global --get user.email)" !="dhoerl@<company>.com" ] then exit 1 fi |