在 Git 上执行 shell 命令时,如何指定专用 SSH 密钥?

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

答案

Host gitserv
    Hostname remote.server.com
    IdentityFile ~/.ssh/id_rsa.github
    IdentitiesOnly yes # see NOTES below
git remote add origin git@gitserv:myrepo.git
git push -v origin master
ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'
ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)
Host github.com
  IdentityFile ~/.ssh/github_rsa
GIT_SSH_COMMAND='ssh -i private_key_file' git clone user@host:repo.git
#!/bin/bash

ssh -i /path/to/ssh/secret/key $1 $2
GIT_SSH=my_git_ssh_wrapper git clone git@github.com:TheUser/TheProject.git

总结答案和评论 ,这是设置 git 以便使用不同的密钥文件然后忘记它的最佳方法,该方法还支持同一主机的不同用户(例如,个人 GitHub 帐户和一个工作帐户),该帐户可在 Windows 上使用同样,是编辑~/.ssh/config (或c:\Users\<your user>\.ssh\config ~/.ssh/config c:\Users\<your user>\.ssh\config )并指定多个标识:

Host github.com
HostName github.com
IdentityFile /path/to/your/personal/github/private/key
User dandv

Host github-work
HostName github.com
IdentityFile /path/to/your/work/github/private/key
User workuser

然后,要以个人用户身份克隆项目,只需运行常规的git clone命令。

要将回购克隆为工作workuser ,请运行git clone git@github-work:company/project.git

使用 git 2.10+(2016 年第三季度:2016 年 9 月 2d 发布),您可以为GIT_SSH_COMMAND设置配置 (而不仅仅是Rober Jack Will答案中描述的环境变量)

参见NguyễnTháiNgọcDuy( pclouds )的 commit 3c8ede3 (2016 年 6 月 26 日
(由Junio C gitster - gitstercommit dc21164 中合并 ,2016 年 7 月 19 日)

添加了新的配置变量core.sshCommand以指定每个存储库使用的GIT_SSH_COMMAND值。

core.sshCommand:

如果设置了此变量,则当git fetchgit push需要连接到远程系统时,它们将使用指定的命令而不是ssh
该命令与GIT_SSH_COMMAND环境变量的格式相同,并且在GIT_SSH_COMMAND环境变量GIT_SSH_COMMAND被覆盖。

这意味着git clone可以是:

cd /path/to/my/repo
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git clone host:repo.git

您甚至可以只用一个命令设置它:

git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git

这比设置GIT_SSH_COMMAND环境变量要容易得多,正如MátyásKuti-Kreszács 指出的那样 ,在 Windows 上将其设置为

set "GIT_SSH_COMMAND=ssh -i private_key_file"

如此处所述: https : //superuser.com/a/912281/607049

您可以按仓库配置它:

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

更好的办法是将该主机或 IP 添加到.ssh/config文件,如下所示:

Host (a space separated list of made up aliases you want to use for the host)
    User git
    Hostname (ip or hostname of git server)
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_(the key you want for this repo)
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo