如何在GitHub上使用多个SSH密钥?

mrfwxfqh  于 2023-04-19  发布在  Git
关注(0)|答案(5)|浏览(179)

GitHub上的SSH配置似乎是一场噩梦。我有多个GitHub帐户,但我可以有多个SSH密钥。在GitHub SSH配置部分,他们提到了这一点:

ssh-keygen -t rsa -C "your_email@example.com"
# Creates a new ssh key, using the provided email as a label
# Generating public/private rsa key pair.

我们强烈建议您保持默认设置不变,这样当系统提示您“Enter a file in which to保存the key”(输入保存密钥的文件)时,只需按Enter键继续。

# Enter file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]

为什么我总是要使用id_rsa文件?它会覆盖我现有的密钥。无论如何,我在这里给予一个新的名称并生成密钥。我完成了将其添加到代理的所有其他步骤,在GitHub SSH密钥部分进行更新。
完成所有这些步骤后,我来到最后一步:

$ ssh -vT git@github.com
Hi animesh11! You've successfully authenticated, but GitHub does not provide shell access.
debug1: channel 0: free: client-session, nchannels 1
Transferred: sent 3128, received 1976 bytes, in 0.5 seconds
Bytes per second: sent 6077.0, received 3838.9
debug1: Exit status 1

一切都很好,但不知何故git clone仍然抱怨:

$ git clone git@github.com:regentmarkets/devbox.git
Cloning into 'devbox'...
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

为什么ssh -vT可以工作而简单的克隆不行?

x7yiwoj4

x7yiwoj41#

我会使用.ssh config为每个特定用户设置不同的配置。
例如,编辑(或创建)用户根目录下的.ssh文件夹中的配置文件,并添加类似以下内容:

Host user1-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user1_rsa
Host user2-github
    HostName github.com
    User git
    IdentityFile ~/.ssh/user2_rsa

其中user1_rsauser2_rsassh-keygen -t rsa -C "user1@example.com"ssh-keygen -t rsa -C "user2@example.com"的输出
然后,在测试时,只需使用ssh -vT user1-githubssh -vT user2-github
此外,在克隆存储库时,请使用git clone user1-github:username1/project.gitgit clone user2-github:username2/project.git

vh0rcniy

vh0rcniy2#

作为对Serban解决方案的补充,这里有另一种使用.ssh/config文件来区分用户的方法。
假设您有一个专业和个人帐户,并且您像这样设置密钥:

$ ssh-keygen -t rsa -f ~/.ssh/perso_rsa -C "nick@perso.org"
$ ssh-keygen -t rsa -f ~/.ssh/pro_rsa   -C "name.surname@pro.company.com"

现在大多数时候,你可以使用一些东西来区分这两个身份。通常,当处理git仓库时,你的git配置与你想要使用的身份绑定,例如git config user.email将返回两个电子邮件地址中的一个,与这个仓库的身份相关联的那个。
在此基础上,我们可以在.ssh/config中使用Match exec <cmd>过滤指令,并编写如下内容:

Match host github.com exec "[ $(git config user.email) = nick@perso.org ]"
    IdentityFile ~/.ssh/perso_rsa

Host github.com
    IdentityFile ~/.ssh/pro_rsa

两个标识都使用常规的git@github.com:user/project.git
其工作原理如下:当主机是github.com时,第一个匹配规则用于确定要使用的IdentityFile。对于第一个规则,运行exec命令,如果该命令返回零退出状态,则选择该规则。我们的测试(传递给用户的shell)检查git config user.email是否返回nick@perso.org。如果是这样,检查返回true,规则匹配,并选择~/.ssh/perso_rsa。如果不是,第二个规则作为github.com的全部捕获,而~/.ssh/pro_rsa被选择。
我们可以为第二个身份添加另一个检查,但是只有两个规则就没有必要了,“捕获所有”行为应该足够了。
我们也可以调整检查来测试其他参数,而不是git中的user.email。例如,我们可以检查当前工作目录的名称。有关Match exec的更多详细信息,请参阅man ssh_config
附加说明(来自Acumenus):

  • 如果用户的shell(至少是bash,zsh)支持,如果检查的一部分(在我们的例子中,$(git config user.email))计算为多个单词,那么双方括号是必要的,因为单括号将break。理想情况下,我们希望在双引号之间引用它,但它们已经用于exec的参数,我没有找到一种方法来转义它们。
  • 使用此设置,通过SSH克隆新存储库将使用与默认用户电子邮件关联的密钥(git config -l中的第一个user.email条目)。要使用另一个密钥克隆存储库,一种解决方案是首先创建存储库,然后添加远程并拉取:mkdir foo; cd foo; git init; git config ...; git remote add origin <URL>; git pull .
  • 如果键的文件是ssh默认查找的文件,例如$HOME/.ssh/id_rsa,则当然不需要全部捕获规则。
  • host指令可用于在必要时同时匹配多个逗号分隔的主机(Match host github.com,gitlab.com exec ...)。
lp0sw83n

lp0sw83n3#

我创建了一个CLI命令来处理这个问题!检查我的repo ~~
这个repo使用ssh-agent来切换你的ssh帐户。

Git_SSH-Account_Switch

CLI工具可以将ssh帐户切换到您当前的shell。在使用服务器时,您可以轻松切换到您的git帐户和ssh密钥,并使用您的帐户在服务器上操作项目。

安装

$ bash ./setup.sh

它会在你的profile$logout_profile中添加一些代码,并在$HOME上设置git-acc.gitacc
文件:
git-acc.sh -〉$HOME/.git-acc,git-acc函数。
.gitacc -〉$HOME/.gitacc,保存在git-acc上注册的信息。

控制

+---------------+
        |    git-acc    |
        +---------------+

SYNOPSIS

  git-acc [account]|[option]

OPTIONS

  [account]               use which accounts on this shell, type the account name that you register.
  -h, --help              print help information.
  -add, --add_account     build git_account info. & ssh-key.
  -rm, --remove_account   remove git_account info. & ssh-key from this device

EXAMPLES

  $ git-acc tw-yshuang
tcbh2hod

tcbh2hod4#

在我的例子中,最简单的选择是使用一个单行命令,它允许我使用对应于该repo的ssh键来获取所需的repo:

git clone git@github.com:<user/group>/<repo.git> -c core.sshCommand="ssh -i /path/to/private/key"
jhiyze9q

jhiyze9q5#

我一直有这个问题,但这是什么为我工作(我在一个mac顺便说一句)
使用github's process,我生成了一个新的ssh密钥,并将其添加到我在github上的个人资料中
我在我的.ssh文件夹中添加了一个config文件,并引用了我的工作ssh密钥和我的个人ssh密钥,如其他答案所述。

Host github.com
  HostName github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/work_key
Host personal
  HostName github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/personal_key

然后,我用ssh-add将这两个密钥添加到我的ssh-agent中:
ssh-add --apple-use-keychain ~/.ssh/work_key
ssh-add --apple-use-keychain ~/.ssh/personal_key
我验证了这两个密钥都是用ssh-add -L添加的
然后I verified the connectionssh -T git@github.comssh -T git@personal,都工作!
在那之后,我能够使用我的个人密钥通过以下命令克隆repos:git clone git@personal:my_username/repo.git(将我从github仓库复制的git@github.com:...替换为git@personal:...
很多这样的答案和this other SO question,沿着文档,得到了我所需要的!

相关问题