这可能是一种非常不寻常的情况,但我想指定在本地计算机上执行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连接到远程服务器的示例,该服务器使用指定的私钥,但这是一个本地命令。有可能吗?


当前回答

在使用GitBash的Windows中,您可以使用以下方法添加存储库

ssh-agent bash -c 'ssh-add "key-address"; git remote add origin "rep-address"'

例如:

ssh-agent bash -c 'ssh-add /d/test/PrivateKey.ppk; git remote add origin git@git.test.com:test/test.git'

哪个私钥在驱动器D中,计算机的文件夹测试。此外,如果您想克隆存储库,可以使用gitclone更改git远程添加源。

在Git Bash中输入此信息后,它会要求您输入密码!

请注意,openssh私钥和putty私钥是不同的!

如果您使用puttygen创建了密钥,则必须将私钥转换为openssh!

其他回答

这是@VonC答案的扩展。请先阅读。

用例是我需要使用SSH同时使用个人和工作GitHub帐户。我希望使用工作SSH密钥作为默认值,因为我的项目内部将有其他工作repo作为依赖项。因此克隆它们应该可以无缝工作。

我遵循的步骤是:

生成默认SSH密钥并将其添加到工作git帐户。在单独的文件中生成个人SSH密钥,并将其添加到个人git帐户。在.bashrc或.zshrc文件中添加以下函数代码并将其作为源代码。gclone(){#使用个人ssh密钥克隆回购urlgit-c core.sshCommand=“ssh-i path_to_personal_key”clone“$1”&&#使用“awk”从URL提取回购名称,并使用“cd”切换到该文件夹cd$(awk‘{sub(/.*\//,“”);sub(/\.git.*/,“””);print}‘<<“$1”)&&#将个人ssh密钥设置为此回购的默认密钥git-config-core.shCommand“ssh-i path_to_personal_key”;}使用gclone命令使用个人SSH密钥克隆repo,并将repo设置为默认使用该密钥。使用正常的gitclone命令以默认(工作)SSH密钥克隆repo。

从Git 2.10.0版开始,您可以按回购或全局配置

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -o 'IdentitiesOnly yes'"

这将为当前回购指定ssh密钥将使用的内容。我假设如果您想指定这个全局,只需要设置--global选项。

我只需要添加密钥,然后再次运行git克隆。

ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git

要使GIT_SSH_COMMAND环境变量在Windows(CMD)下工作,而不是:

set GIT_SSH_COMMAND="ssh -i private_key_file"

Use:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

报价必须是这样的

set "variable=value" 

一些背景:https://stackoverflow.com/a/34402887/10671021

我使用zsh,不同的密钥会自动加载到我的zsh shell的ssh代理中,用于其他目的(即访问远程服务器)。我修改了@Nick的答案,并将其用于我的一个需要经常刷新的转发。(在本例中,无论我在哪里工作,我都希望在所有计算机上使用相同的最新版本的点文件。)

bash -c 'eval `ssh-agent`; ssh-add /home/myname/.dotfiles/gitread; ssh-add -L; cd /home/myname/.dotfiles && git pull; kill $SSH_AGENT_PID'

生成ssh代理向代理添加只读密钥将目录更改为我的git repo如果cd到repo目录成功,则从远程repo中拉出杀死派生的ssh代理。(我不希望有很多特工在身边徘徊。)