2011-01-12 18:20:31 +0000 2011-01-12 18:20:31 +0000
702
702

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

ssh-i选项,可以告诉身份验证时使用哪个私钥文件:

-i identity_file

选择从哪个文件中读取RSA或DSA身份认证的身份(私钥)。  默认是 1的协议版本 1, 2的协议版本 2的协议版本 也可以在配置文件中按每个主机指定身份文件。  可以有多个~/.ssh/identity选项(也可以在配置文件中指定多个身份)。

有没有类似的方法告诉~/.ssh/id_rsa~/.ssh/id_dsa目录下有多个私钥的系统中使用哪个私钥文件?

Ответы (19)

720
720
720
2011-01-12 19:36:21 +0000

~/.ssh/config中,添加:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

如果配置文件是新的,不要忘记做chmod 600 ~/.ssh/config

现在你可以做git clone git@github.com:{ORG_NAME}/{REPO_NAME}.git

  • 其中{ORG_NAME}是你的GitHub用户账户(或组织账户)的GitHub URI名。
  • 注意,在:后面有一个冒号github.com,而不是斜线/ - 因为这不是一个URI。SSH会以一种不明确的方式拒绝太可读的SSH密钥。只会出现类似于信令拒绝的情况。这种情况下,解决方法是:
chmod 400 ~/.ssh/id_rsa_github
387
387
387
2015-05-08 09:43:07 +0000

10.0版本,你可以在每个repo或全局配置,这样你就不用再设置环境变量了!

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example
122
122
122
2015-01-23 22:08:00 +0000

没有直接的方法告诉git要使用哪一个私钥,因为它依赖于ssh进行仓库认证。但是,仍然有几种方法可以实现你的目标:

选项 1: ssh-agent

选项 1: ssh-agent

你可以使用 GIT_SSH_COMMAND 来临时授权你的私钥。

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

选项三:GIT_SSH_COMMAND

选项三:$

通过使用环境变量没有**直接的方法**告诉git要使用哪一个私钥,因为它依赖于ssh`进行仓库认证。但是,仍然有几种方法可以实现你的目标:

选项 1: ssh-agent

选项 1: ssh-agent

你可以使用 GIT_SSH_COMMAND 来临时授权你的私钥。

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

选项三:GIT_SSH_COMMAND

选项三:$

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

注:GIT_SSH是从v0.99.4版本开始的 (2005年)。

33
33
33
2011-01-12 18:25:51 +0000

写一个脚本,用你想要的参数调用ssh,然后把脚本的文件名放在$GIT_SSH中。或者直接把你的配置放在~/.ssh/config中。

22
22
22
2016-05-17 15:03:09 +0000

~/.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
22
22
22
2015-07-21 19:44:50 +0000

如果你不希望每次运行git时都要指定环境变量,不需要另一个包装程序脚本,不需要/不能运行ssh-agent(1),也不想为此下载另一个包,那就使用git-remot-ext(1)外部传输。

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

我认为这个方案更优越,因为:

  • 它是特定于版本库/remote的
  • 避免了包装程序脚本的臃肿
  • 不需要SSH代理 – 如果你想在无人值守的情况下进行克隆/推送/拉取(例如在cron中的克隆/推送/拉取),那么这个方案就很有用。 例如在cron中)
  • 当然,不需要外部工具。
17
17
17
2015-05-28 17:09:40 +0000

经过我在$GIT_SSH上的挣扎,我想分享一下我的成功经验。

通过我的例子,我将假设你的私钥位于/home/user/.ssh/jenkins

要避免的错误。GIT/SSH值包括选项

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

或其他类似的选项会失败,因为git会尝试将该值作为文件执行。因此,你必须创建一个脚本。

7
7
7
2013-03-23 01:35:15 +0000

你可以直接使用 ssh-ident 而不是创建自己的包装器。

你可以在以下网站阅读更多内容。https://github.com/ccontavalli/ssh-ident

它可以在第一次需要的时候按需加载ssh密钥,一次加载,即使是多个登录会话、exterms或NFS共享家园。

通过一个小小的配置文件,它可以根据你的需要自动加载不同的密钥,并将它们分开放在不同的代理中(用于代理转发)。

6
6
6
2018-03-26 19:26:38 +0000

我有一个客户需要一个单独的github账户,所以我需要为这个项目使用单独的密钥。我的解决方案是在我的.cshrc/.bashrc中添加这样的内容:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

每当我想用git来做这个项目的时候,我就把 “infogit "替换成git:

infogit commit -am "Some message" && infogit push

对我来说,这样更容易记住。

5
5
5
2018-12-04 22:21:13 +0000

所以我将GIT/SSH env变量设置为$HOME/bin/git-ssh

为了支持我的repo配置决定使用哪个ssh身份,我的~/bin/git-ssh文件是这样的:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

然后我有一个全局的git config设置:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

在任何一个git仓库里,我可以设置一个本地的ssh.identity git config值:

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

如果你可以为每一个身份设置不同的电子邮件地址,那就更简单了,因为你可以用你的电子邮件地址来命名你的密钥,然后让git config的user.email来驱动~/bin/git-ssh中的密钥选择,就像这样:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
3
3
3
2018-05-03 10:17:14 +0000

我是在@shellholic和this SO线程的基础上加了一些teaks。我以GitHub为例,假设你在~/.ssh/github里有一个私钥(否则请看this SO线程),并且你在GitHub的配置文件中添加了公钥(否则请看GitHub的帮助)。

如果需要的话,在~/.ssh/config处创建一个新的SSH配置文件,并将权限改为400

touch ~/.ssh/config
chmod 600 ~/.ssh/config

添加到~/.ssh/config文件中:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

如果你已经有了远程设置,你可能需要删除它,否则可能仍然会被提示用户名和密码。

git remote rm origin
git remote add origin git@github.com:user_name/repo_name.git

然后在git仓库中添加一个远程,注意用户名前的冒号:

git push origin master
git pull origin

然后git命令正常工作,例如 例如:

&001

@HeyWatchThis在这个SO线程上建议加入IdentitiesOnly yes,以防止SSH默认的行为,即发送与每个协议的默认文件名匹配的身份文件。更多信息和参考资料请参见该线程。

3
3
3
2015-12-05 12:22:32 +0000

–key和 –port是可选的。

3
3
3
2016-02-11 22:44:57 +0000

一般情况下,你想用~/.ssh/config来实现。只需将服务器地址与你要使用的密钥配对如下:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host *表示任意服务器,所以我用它来设置~/.ssh/id_rsa作为默认密钥使用。

2
2
2
2018-07-05 09:53:09 +0000
# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

执行上述命令后,可以同时使用这两个键。只要输入

git clone git@github.com:<yourname>/<your-repo>.git

就可以克隆你的仓库。

1
1
1
2019-08-31 05:43:47 +0000
# start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # stop :: how-to use different ssh identity files
1
1
1
2019-01-07 18:26:23 +0000

虽然这个问题并没有要求,但我在这里为其他想解决同样问题的人提供了这个答案。在我的情况下,我是以一个gitlab服务器的身份推送到gitlab服务器–我想以一个特定的用户的身份推送–当然,这个用户是由身份验证期间的private-key定义的,而不是用户名~/.ssh/config。一旦实现,我只需执行以下操作:

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

设置

在我的情况下,调用你的私钥 git的位置。

/myfolder/.ssh/my_gitlab_id_rsa:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

中添加一个条目,在 ~/.ssh/config:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

中添加 git-alias 作为奖励,我 在这个主机上以特定用户的身份执行我的提交 与这个 git-alias

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

解释

以上所有的操作都是假设相关的远程是~/.gitconfig,并且相关的分支目前已经被检查出来了。作为参考,我遇到了几项需要解决的问题。

  • 该方案需要创建一个新的远程origin,我不喜欢看到多余的远程挂在我的日志树上,所以我在完成后就把它删除了
  • 为了创建远程。有必要实时生成远程的 url - 在 gitlab 的情况下,可以通过一个简单的 bash cut
  • 当执行推送到 gitlab_as_me 时,你需要明确你要推送的是什么分支
  • 在执行推送后,你的本地 gitlab_as_me 指针需要被 “更新 "以匹配 origingitlab_as_me 会这样做
1
1
1
2019-04-06 20:42:39 +0000

当你有多个git账号,并且你想要不同的ssh密钥时

你必须按照同样的步骤生成ssh密钥,但要确保你

ssh-keygen -t ed25519 -C "your-email-id@gmail.com"

输入你要保存的路径(例如:my-pc/Desktop/. ssh/ed25519)

将公钥添加到你的 gitlab 如何将 ssh 密钥添加到 gitlab)

你必须使用下面的命令

ssh-add ~/my-pc/Desktop/.ssh/ed25519
``` 来新建 ssh 身份。
0
0
0
2018-06-06 04:37:12 +0000

我使用的是git 2.16版本,我不需要任何脚本,甚至不需要任何配置和修改命令。我没有问任何问题,也没有抛出一个错误。就能正常工作。

0
0
0
2020-01-24 00:58:26 +0000

如果你需要用不同的密钥连接到同一主机,那么你可以通过以下方法实现:

  1. 用不同的Hosts,但相同的HostNames来配置~/.ssh/config
  2. 使用合适的主机克隆你的repo。