这可能是一种非常不寻常的情况,但我想指定在本地计算机上执行shell(git)命令时要使用的私有SSH密钥。

基本上是这样的:

git clone git@github.com:TheUser/TheProject.git -key "/home/christoffer/ssh_keys/theuser"

或者更好(用Ruby):

with_key("/home/christoffer/ssh_keys/theuser") do
  sh("git clone git@github.com:TheUser/TheProject.git")
end

我见过使用Net::SSH连接到远程服务器的示例,该服务器使用指定的私钥,但这是一个本地命令。有可能吗?


当前回答

这些解决方案都不适合我。

相反,我详细介绍了@Martin v.Löwis提到的为SSH设置配置文件。

SSH将查找用户的~/.SSH/config文件。我的设置如下:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

我添加了一个远程git存储库:

git remote add origin git@gitserv:myrepo.git

然后git命令对我来说正常工作。

git push -v origin master

笔记

IdentitesOnly yes是必需的,以防止SSH默认行为发送与每个协议的默认文件名匹配的标识文件。如果您有一个名为~/.ssh/id_rsa的文件,则在不使用此选项的情况下,将在~/.sss/id_rsa.gitub之前尝试该文件。

工具书类

在一个客户端上使用多个SSH私钥的最佳方法我怎样才能阻止ssh提供错误的密钥

其他回答

从Git2.3.0开始,我们还有一个简单的命令(不需要配置文件):

GIT_SSH_COMMAND='ssh -i private_key_file -o IdentitiesOnly=yes' git clone user@host:repo.git

请注意,需要-o IdentitesOnly=yes来防止SSH默认行为,即发送与每个协议的默认文件名相匹配的标识文件,如上面的答案所示。

问题是当您在同一主机上有不同的远程存储库(比如github.com),并且您希望使用不同的ssh密钥(即不同的github帐户)与它们进行交互时。

为了做到这一点:

首先,您应该在~/.ssh/config文件中声明不同的密钥。#github.com上常用存储库的密钥主机github.com主机名github.com用户git身份文件~/.ssh/id_rsa#github.com上特定存储库的密钥主机XXX主机名github.com用户git身份文件~/.ssh/id_other_rsa通过这样做,您可以将第二个密钥与github.com的新友好名称“XXX”相关联。然后,您必须更改特定存储库的远程源,以便它使用您刚才定义的友好名称。在命令提示符下转到本地存储库文件夹,并显示当前远程源:>git远程-v起源git@github.com:myuser/myrepo.git(获取)起源git@github.com:myuser/myrepo.git(推送)然后更改原点:>git远程设置url源git@XXX:myuser/myrepo.git>git远程-v起源git@XXX:myuser/myrepo.git(获取)起源git@XXX:myuser/myrepo.git(推送)现在你可以推,取。。。自动按右键。

这里给出的大多数答案都没有解释最基本用法的细节。

在云中设置服务器(在本例中为linux服务器)后,您可以从终端使用ssh连接到该服务器。

从您的计算机中,将云服务提供商(如Azure、AWS等)提供给您的私钥dyson-ubuntu-vm.pem添加到本地计算机上的.ssh配置中,如下所示:

将.pem文件复制到/home/ssenyonjo/.ssh文件夹,然后打开/home/ssseyonjo/.shsh/config文件并添加以下条目:

Host 20.85.213.44
  HostName 20.85.213.44
  User Dyson
  IdentityFile /home/ssenyonjo/.ssh/dyson-ubuntu-vm.pem
  IdentitiesOnly yes

现在从您的终端访问云linux服务器,如下所示:

ssh Dyson@20.85.213.44

当这起作用时,在云服务器上创建一个git项目,如下所示:

Dyson@dyson-ubuntu-vm:~/projects$ git init --bare s2

现在回到您的本地计算机,克隆空存储库,如下所示:

ssenyonjo@ssenyonjo-pc:~/Projects/mastering-git$ git clone ssh://Dyson@20.85.213.44/home/Dyson/projects/s2

如果您看到类似以下的错误:致命:无法从远程存储库读取,这意味着您访问了错误的文件夹。确保已概述从根目录到创建的存储库的正确路径。

如果您不想设置配置文件,但想访问需要密钥的ssh服务器,可以使用以下命令:

GIT_SSH_COMMAND='ssh -i ~/Projects/aws/keys/aws_ubuntu.pem'  git clone ssh://ubuntu@15.207.99.158/home/ubuntu/projects/mastering-git/rand 

您可以导出命令以继续将其用于其他任务,如gitpush和gitpull

export GIT_SSH_COMMAND='ssh -i ~/Projects/aws/keys/aws_ubuntu.pem'

参见:https://stackoverflow.com/a/29754018/10030693

为什么不将身份密钥的位置添加到特定回购的git配置文件中,如下所示:

cd .git

vi config

[core]
    sshcommand = ssh -i <IDENTITY_KEY_LOCATION>

这就是你所需要的。

这些解决方案都不适合我。

相反,我详细介绍了@Martin v.Löwis提到的为SSH设置配置文件。

SSH将查找用户的~/.SSH/config文件。我的设置如下:

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below

我添加了一个远程git存储库:

git remote add origin git@gitserv:myrepo.git

然后git命令对我来说正常工作。

git push -v origin master

笔记

IdentitesOnly yes是必需的,以防止SSH默认行为发送与每个协议的默认文件名匹配的标识文件。如果您有一个名为~/.ssh/id_rsa的文件,则在不使用此选项的情况下,将在~/.sss/id_rsa.gitub之前尝试该文件。

工具书类

在一个客户端上使用多个SSH私钥的最佳方法我怎样才能阻止ssh提供错误的密钥