我在使用两个不同的SSH密钥/ GitHub帐户以便一起玩时遇到一些麻烦。我有以下设置:
可以使用git@github.com:accountname
可使用git@github.com:anotheraccount
每个帐户都有自己的SSH密钥。已添加两个SSH密钥,我已创建配置文件。我不相信配置文件是正确的。我不太确定如何指定使用git@github.com:accountname
访问的repos应该使用id_rsa
而git@github.com:anotheraccount
应该使用id_rsa_anotheraccount
。
答案 0 :(得分:297)
安迪莱斯特的反应是准确的,但我发现了我需要做的一个重要的额外步骤才能使其发挥作用。在尝试设置两个配置文件时,一个用于个人,一个用于工作,我的~/.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
在我做ssh-add ~/.ssh/work_rsa
之前,我的工作资料没有采取。之后,与github的连接使用了正确的配置文件。以前他们违约了第一张公钥。
对于使用ssh-add
时无法打开与身份验证代理的连接,请检查:
https://stackoverflow.com/a/17695338/1760313
答案 1 :(得分:161)
我最近不得不这样做,不得不筛选所有这些答案及其评论,最终将信息拼凑在一起,所以为了方便起见,我会在一篇文章中把它全部放在这里:
第1步:ssh键
创建您需要的任何密钥对。在这个例子中,我将默认/原始'id_rsa'(默认值)命名为我,新命名为'id_rsa-work':
ssh-keygen -t rsa -C "stefano@work.com"
第2步:ssh config
通过创建/修改〜/ .ssh / config 来设置多个ssh配置文件。请注意略有不同的“主机”值:
# 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)
如果您的参赛作品不在,请运行:
ssh-add ~/.ssh/id_rsa_work
第4步:测试
为了测试你是否正确完成了这一切,我建议进行以下快速检查:
$ 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),具体取决于您要使用的密钥/标识。但现在你应该好好去! :)
答案 2 :(得分:39)
假设alice
是github.com用户,拥有2个或更多私有存储库repoN
。
对于此示例,我们将仅使用名为repo1
和repo2
https://github.com/alice/repo1
https://github.com/alice/repo2
您需要从这些存储库中提取,而无需在服务器或多个服务器上输入密码。
例如,您希望执行git pull origin master
,并且您希望在不要求密码的情况下执行此操作。
你不喜欢处理ssh-agent,你已经发现(或者你现在正在发现)关于~/.ssh/config
一个文件,让你的ssh客户端知道根据主机名和用户名使用什么私钥,使用如下所示的简单配置条目:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
所以你继续创建了你的(alice_github.id_rsa, alice_github.id_rsa.pub)
密钥对,然后你也去了你的知识库的.git/config
文件,你修改了你的远程origin
的网址是这样的:< / p>
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
最后,您访问了存储库Settings > Deploy keys
部分,并添加了alice_github.id_rsa.pub
此时,您可以在不输入密码的情况下执行git pull origin master
。
所以你的直觉是获取该密钥并将其添加到repo2
的部署密钥,但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
的部署密钥配置github.com上,但现在您有一个ssh问题需要处理。
github.com
域上,ssh如何判断使用哪个密钥?您的.ssh/config
文件指向github.com
,并且在知道拉动时它不知道要使用哪个密钥。
所以我在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
文件中,现在您将能够为每个子域输入配置:)
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
现在您可以git pull origin master
而无需从两个存储库输入任何密码。
如果你有多台机器,你可以将钥匙复制到每台机器上并重复使用它们,但我建议做腿部工作,每台机器生成1个钥匙和回购。您将拥有更多要处理的密钥,但如果受到攻击,您将不那么容易受到攻击。
答案 3 :(得分:20)
我在github上有2个帐号,这就是我所做的(在linux
上)以使其正常工作。
ssh-keygen
创建2对rsa密钥,正确命名,以便让生活更轻松。ssh-add path_to_private_key
<强>的〜/ .ssh /配置强>
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设置远程网址:
对于主持人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-&lt; identify_specific_user&gt;
主机可以是任何可以识别主机和帐户的值,
它不需要是一个真正的主机,
例如
github-kc
为我的本地人在github上识别我的一个帐户
笔记本电脑,
为git repo设置远程网址时,这是git@
之后的值,这就是回购映射到主机的方式,例如git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
Host
]的子选项 Hostname
github.com
表示github,User
git git
,IdentityFile
LogLevel
DEBUG3
会提供最详细的信息。答案 4 :(得分:17)
使用IdentityFile
中的~/.ssh/config
参数:
Host github.com
HostName github.com
IdentityFile ~/.ssh/github.rsa
User petdance
答案 5 :(得分:2)
就我而言,上述解决方案都没有解决我的问题,但ssh-agent确实如此。基本上,我做了以下事情:
使用如下所示的ssh-keygen生成密钥对。它会生成一个密钥对(在此示例中为.\keyfile
和.\keyfile.pub
)
ssh-keygen -t rsa -b 4096 -C "yourname@yourdomain" -f keyfile
将keyfile.pub
上传到git提供程序
ps -ef | grep ssh-agent
以查看它是否已在运行)ssh-add .\keyfile
以添加凭据git clone git@provider:username/project.git
答案 6 :(得分:2)
我花了很多时间来理解所有步骤。所以让我们一步一步地描述:
ssh-keygen -t rsa
创建新的身份文件。给它一个像proj1.id_rsa
这样的替代方案,毫无疑问,因为你不需要密码短语。在.ssh/config
中添加新部分:
Host proj1.github.com
HostName github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/proj1.id_rsa
考虑到第一部分并注意proj1.github.com
我们稍后会回到该部分。
ssh-add ~/.ssh/proj1.id_rsa
proj1.github.com
(完全是配置文件中的主机)来实现它。
git clone git@proj1.github.com
。不要搞砸主人
答案 7 :(得分:1)
我发布了用于处理这些here
的技术答案 8 :(得分:1)
我用过,
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_rsa
User abc@gmail.com
工作正常。
将.ssh / config文件中的上述设置用于不同用户名的不同rsa密钥。
答案 9 :(得分:1)
作为@stefano答案的补充,
在为另一个帐户生成新的SSH密钥时,最好使用-f
命令,
ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"
由于id_rsa_work
文件在路径~/.ssh/
中不存在,我手动创建此文件,但它不起作用:(
答案 10 :(得分:1)
编辑ssh配置文件的一种可能更简单的替代方法(如所有其他答案中所建议的)是将单个存储库配置为使用不同的(例如,非默认的)ssh密钥。
在要使用其他密钥的存储库中,运行:
git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'
并确保通过运行:
将您的密钥添加到ssh-agentssh-add ~/.ssh/id_rsa_anotheraccount
请记住,上面的命令只会为当前会话的ssh-agent添加密钥。如果你想让它永远工作,你必须永久地&#34;将它添加到您的ssh-agent。例如,ubuntu和OSX的处理方式如何。
还应该可以使用全局git配置和条件包含(see example)将此方法扩展到多个存储库。功能
答案 11 :(得分:1)
请按照以下步骤进行操作,以解决它看起来很长的时间,但是请相信,它不会超过5分钟:
步骤1:创建两个ssh密钥对:
ssh-keygen -t rsa -C "your_email@youremail.com"
步骤2:它将在此处创建两个ssh密钥:
~/.ssh/id_rsa_account1
~/.ssh/id_rsa_account2
步骤3:现在我们需要添加以下密钥:
ssh-add ~/.ssh/id_rsa_account2
ssh-add ~/.ssh/id_rsa_account1
- 您可以使用以下命令查看添加的键列表:
ssh-add -l
- 您可以通过以下命令删除旧的缓存密钥:
ssh-add -D
步骤4:修改ssh配置
cd ~/.ssh/
touch config
subl -a config
或code config
或nano config
第5步:将此添加到配置文件:
#Github account1
Host github.com-account1
HostName github.com
User account1
IdentityFile ~/.ssh/id_rsa_account1
#Github account2
Host github.com-account2
HostName github.com
User account2
IdentityFile ~/.ssh/id_rsa_account2
步骤6:更新您的.git/config
文件:
步骤6.1:导航到account1的项目并更新主机:
[remote "origin"]
url = git@github.com-account1:account1/gfs.git
如果其他用户在他们的git Repository中邀请您。 然后,您需要像这样更新主机:
[remote "origin"]
url = git@github.com-account1:invitedByUserName/gfs.git
步骤6.2:导航到account2的项目并更新主机:
[remote "origin"]
url = git@github.com-account2:account2/gfs.git
步骤7:如果需要,分别更新每个存储库的用户名和电子邮件,这不是一个修正步骤:
导航到account1项目并运行以下命令:
git config user.name "account1"
git config user.email "account1@domain.com"
导航到account2项目并运行以下命令:
git config user.name "account2"
git config user.email "acccount2@doamin.com"