如何告诉 git 使用哪个私钥?

如何告诉 git 使用哪个私钥?

ssh可以-i选择在身份验证时使用哪个私钥文件:

-i identity_file

    选择从中读取 RSA 或 DSA 身份验证的身份(私钥)的文件。~/.ssh/identity对于协议版本 1,默认值为~/.ssh/id_rsa~/.ssh/id_dsa对于协议版本 2,默认值为 。还可以在配置文件中按主机指定身份文件。可以有多个-i选项(以及配置文件中指定的多个身份)。

在目录中具有多个私钥的系统上,是否有类似的方法来判断git使用哪个私钥文件~/.ssh

答案1

在 中~/.ssh/config添加:

Host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github

如果配置文件是新的,请使用以下命令检查访问权限

stat -c %a ~/.ssh/config

如果返回结果不是 600,则应该执行

chmod 600 ~/.ssh/config

现在你可以做git clone [email protected]:{ORG_NAME}/{REPO_NAME}.git

  • {ORG_NAME}您的 GitHub 用户帐户(或组织帐户)的 GitHub URI 名称在 哪里。
    • :请注意,后面有一个冒号github.com而不是斜线/- 因为这不是 URI。
  • {REPO_NAME}你的 GitHub 存储库的 URI 名称是
  • 例如,对于 Linux 内核这将是)。git clone [email protected]:torvalds/linux.git

注意:在 Linux 和 macOS 上,请验证您的权限IdentityFile是否为 400。SSH 将以不太明确的方式拒绝可读性太强的 SSH 密钥。它看起来就像是凭据被拒绝。在这种情况下,解决方案是:

chmod 400 ~/.ssh/id_rsa_github

答案2

环境变量GIT_SSH_COMMAND

GIT_SSH_COMMAND从 Git 2.3.0 版本开始,你可以像这样使用环境变量:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

请注意,-i有时您的配置文件可能会覆盖它,在这种情况下,您应该给 SSH 一个空的配置文件,如下所示:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone [email protected]:example/example.git

配置core.sshCommand

自 Git 版本 2.10.0 起,您可以使用设置针对每个存储库或全局进行配置core.sshCommand。不再需要使用环境变量。以下是如何克隆存储库并同时设置此配置的方法:

git clone -c "core.sshCommand=ssh -i ~/.ssh/id_rsa_example -F /dev/null" [email protected]:example/example.git
cd example/
git pull
git push

如果 repo 已经存在,请运行:

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"

配置保存在.git/config

答案3

直接的方式来判断git要使用哪个私钥,因为它依赖于ssh存储库身份验证。但是,仍有几种方法可以实现您的目标:

选项1:ssh-agent

您可以使用ssh-agent它来临时授权您的私钥。

例如:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

选项 2:GIT_SSH_COMMAND

使用GIT_SSH_COMMAND环境变量传递 ssh 参数(Git 2.3.0+)。

例如:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

您可以在一行中输入所有内容 — — 忽略$并省略\

选项 3:GIT_SSH

通过使用环境变量传递 ssh 参数GIT_SSH来指定备用ssh二进制文件。

例如:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

注意:以上几行是 shell(终端)命令行,您应将其粘贴到终端中。它们将创建一个名为ssh,使其可执行,并(间接)执行它。

笔记:GIT_SSH自 v0.99.4 起可用(2005)。

选项 4:~/.ssh/config

使用~/.ssh/config其他答案中建议的文件来指定私钥的位置,例如

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa

答案4

在 中使用自定义主机配置~/.ssh/config,如下所示:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

然后使用您的自定义主机名,如下所示:

git remote add thuc git@gitlab-as-thuc:your-repo.git  

相关内容