多个 GitHub 帐户和 SSH 配置
Posted
技术标签:
【中文标题】多个 GitHub 帐户和 SSH 配置【英文标题】:Multiple GitHub Accounts & SSH Config 【发布时间】:2011-03-14 15:25:04 【问题描述】:我在让两个不同的 SSH 密钥/GitHub 帐户配合使用时遇到了一些问题。我有以下设置:
使用git@github.com:accountname
从一个帐户访问回购
使用 git@github.com:anotheraccount
可从另一个帐户访问存储库
每个帐户都有自己的 SSH 密钥。两个 SSH 密钥都已添加,并且我创建了一个配置文件。我不相信配置文件是正确的。我不太确定如何指定使用git@github.com:accountname
访问的存储库应该使用id_rsa
和git@github.com:anotheraccount
应该使用id_rsa_anotheraccount
。
【问题讨论】:
我发现这个链接很有帮助medium.freecodecamp.org/… 我在 ~/.ssh/config 中有 3 个单独的 SSH 身份。用于学校服务器的有密码;用于单独工作/个人 GitHub 帐户的 2 没有。运行git pull
一直失败并要求输入学校密码,尽管有单独的身份文件、“IdentitiesOnly=yes”、单独的域和主机名,都存在于ssh-add -l
中……无论设置如何,uni 密钥都是“第一”。必须将其部分移到 .ssh/config 中的其他部分下方,现在来自两个 GitHub 帐户的 git pull
成功,无需询问 uni ssh 密码。
这里详细回答superuser.com/questions/232373/…
【参考方案1】:
编辑 ssh 配置文件的一种可能更简单的替代方法(如所有其他答案中所建议的)是将单个存储库配置为使用不同的(例如非默认)ssh 密钥。
在要使用不同密钥的存储库中,运行:
git config core.sshCommand 'ssh -i ~/.ssh/id_rsa_anotheraccount'
如果您的密钥受密码保护并且您不想每次都输入密码,则必须将其添加到 ssh-agent。以下是ubuntu 和macOS 的操作方法。
还应该可以使用全局 git config 和条件包含 (see example) 将此方法扩展到多个存储库。
【讨论】:
【参考方案2】:按照这些步骤来解决这个问题,它看起来太长了,但相信我不会超过 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
第四步:修改 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 存储库中受到其他用户的邀请。 然后你需要像这样更新主机:
[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"
【讨论】:
是否有任何关于将-account1
附加到 github 域的文档?经过测试,它确实有效,但它让我感到惊讶,因为我在任何地方都没有读到它。【参考方案3】:
我发布了我用来处理这些here的技术
【讨论】:
【参考方案4】:我花了很多时间来了解所有步骤。所以让我们一步一步描述:
-
使用
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 代理
ssh-add ~/.ssh/proj1.id_rsa
这是我第一次搞砸的——现在,当你想克隆一个 proj1 存储库时,你可以使用 proj1.github.com
(确切地说是配置文件中的主机)。
git clone git@proj1.github.com
。
A good tutorial.
别惹宿主
【讨论】:
感谢教程的链接!您有一个错字:键名id_rsa_proj1
和 proj1_id_rsa
实际上应该相同。您还可以将教程中有关.git/config
设置的部分添加到您的答案中。
你还有一个错字:proj1.id_rsa
vs. proj1_id_rsa
【参考方案5】:
我在 github 上有 2 个帐户,这是我所做的(在 linux
上)以使其正常工作。
按键
通过ssh-keygen
创建 2 对 rsa 密钥,正确命名它们,让生活更轻松。
通过ssh-add path_to_private_key
将私钥添加到本地代理
为每个 github 帐户上传一个(不同的)公钥。
配置
~/.ssh/config
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:
git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
对于主机github-abc
中的repo:
git remote set-url origin git@github-abc:abcdefg/yyy.git
说明
~/.ssh/config
中的选项:
Host
github-github-kc
在 github 上为我的本地识别我的一个帐户
笔记本电脑,
当为 git repo 设置远程 url 时,这是放在 git@
之后的值,这就是 repo 映射到主机的方式,例如 git remote set-url origin git@github-kc:kuchaguangjie/pygtrans.git
Host
的子选项]
Hostname
指定实际主机名,github 使用github.com
,
User
git
对于 github,用户始终为 git
,
IdentityFile
指定要使用的密钥,只需将路径放入公钥,
LogLevel
指定要调试的日志级别,如果有任何问题,DEBUG3
会提供最详细的信息。
【讨论】:
可爱——不需要ssh-add path_to_private_key
——可能是因为在这种情况下不需要代理。配置文件明确定义了键的路径。
@MarkChackerian 我认为您不需要ssh-add
,因为您的密钥不受密码保护,或者(如果您在 Mac 上)OSX 钥匙串正在为您处理它。 ssh-add
使您无需在每次访问密钥时都输入密码。
太棒了,我要找的东西。谢谢【参考方案6】:
在我的情况下,上述解决方案都没有解决我的问题,但 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
【讨论】:
【参考方案7】:Andy Lester 的回答是准确的,但我发现我需要采取一个重要的额外步骤才能使其正常工作。在尝试设置两个配置文件时,一个用于个人,一个用于工作,我的~/.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://***.com/a/17695338/1760313
【讨论】:
谢谢! -ssh-add
是我所缺少的。
通过使用 ssh-add,我可以看到我没有正确设置密钥的文件权限。一旦我修复了一切正常。所以谢谢!
另见doblock.com/articles/…。关键的新信息是您可能需要将用户名(在本例中为“work”)添加到远程 URL 中的主机名,即 git@work.github.com:work/my_repo.git(如反对“git@github.com...”)
这工作:superuser.com/questions/232373/…
要解决“他们默认使用第一个公钥”的问题,请将IdentitiesOnly yes
添加到您的~/.ssh/config
文件的Host *
部分。这告诉 ssh 实际使用您指定的 IdentityFiles,而不是向服务器发送垃圾邮件。【参考方案8】:
假设 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
的 URL 修改为如下所示:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
最后你去了存储库Settings > Deploy keys
部分并添加了alice_github.id_rsa.pub
的内容
此时,您可以在不输入密码的情况下执行git pull origin master
,而不会出现问题。
但是第二个存储库呢?
因此,您的直觉是获取该密钥并将其添加到 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)
您现在将新的公钥放在 github.com 上的 repo2
的 Deploy keys 配置中,但现在您需要处理 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 个密钥。您将有更多的密钥需要处理,但如果其中一个被泄露,您将不会那么容易受到攻击。
【讨论】:
指定与.ssh/config
中的主机匹配的子域是关键步骤 - 非常感谢
很好地解释了Host
组件,谢谢【参考方案9】:
作为@stefano 回答的补充,
为另一个帐户生成新的 SSH 密钥时,最好使用带有-f
的命令,
ssh-keygen -t rsa -f ~/.ssh/id_rsa_work -C "your@mail.com"
由于路径~/.ssh/
中不存在id_rsa_work
文件,我手动创建此文件,但它不起作用:(
【讨论】:
【参考方案10】:我用过,
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_rsa
User abc@gmail.com
一切正常。
在您的 .ssh/config 文件中为不同的用户名使用不同的 rsa 密钥。
【讨论】:
【参考方案11】:我最近不得不这样做,并且必须筛选所有这些答案和他们的 cmets 以最终将信息拼凑在一起,所以为了您的方便,我将把它们都放在一个帖子中:
第 1 步:ssh 密钥 创建您需要的任何密钥对。在此示例中,我将我命名为默认/原始“id_rsa”(这是默认值)和我的新名称“id_rsa-work”:
ssh-keygen -t rsa -C "stefano@work.com"
第 2 步:ssh 配置 通过创建/修改 ~/.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)。但现在你应该好好去! :)
【讨论】:
这是一个很好的回应。我必须使用 ssh-add 添加两个 ssh 密钥才能使用配置文件。谢谢 :) 我唯一想补充的是,当你运行 ssh-keygen -t rsa 时,它会给你一个默认的文件名,即你输入自定义文件名的地方。 最佳答案之一。这个视频也帮助了我。 youtube.com/watch?v=fnSRBRiQIU8&feature=youtu.be 好帖子,如果这篇帖子包含设置你的 git config 'email' 就好了:help.github.com/articles/… 如果其他人在执行“ssh-agent”时遇到“连接代理错误”,请查看***.com/questions/52113738/…【参考方案12】:在~/.ssh/config
中使用IdentityFile
参数:
Host github.com
HostName github.com
IdentityFile ~/.ssh/github.rsa
User petdance
【讨论】:
谢谢,但这不是很准确。我找到了答案并在下面分享。 我很确定我的方法适用于您的情况。您可以识别不同的用户和不同的身份文件。只需要在配置节上给每个不同的 Host 参数。 安迪,根据我在下面找到的链接,我需要从主机中删除 .com。一旦我这样做了,它就可以正常工作了。以上是关于多个 GitHub 帐户和 SSH 配置的主要内容,如果未能解决你的问题,请参考以下文章