ChatGPT解决这个技术问题 Extra ChatGPT

在 Git 上执行 shell 命令时如何指定要使用的私有 SSH 密钥?

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

基本上是这样的:

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 连接到远程服务器的示例,但这是一个本地命令。可能吗?

我想知道为什么这很不寻常,以至于 Git 没有像 ssh 这样的 -i 选项。
使用 git 2.10(2016 年第三季度),您还有一个新配置:git config core.sshCommand 'ssh -i private_key_file'。请参阅my answer below
在我看来,HeyWatchThis 答案应该是公认的答案,因为它允许在设置后正常执行所有 git 命令,而不是像当前接受的答案所要求的那样为每个 git 命令创建一个子 shell。
真的是一次性使用吗?如果没有,应该首先在 ~/.ssh/config 中关联主机别名和密钥。 Details here

m
mikemaccana

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

相反,我详细说明了@Martin v. Löwis 提到为 SSH 设置 config 文件。

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

笔记

需要 IdentitiesOnly yes 以防止 SSH 默认行为发送与每个协议的默认文件名匹配的身份文件。如果您有一个名为 ~/.ssh/id_rsa 的文件,它将在您的 ~/.ssh/id_rsa.github 之前尝试,而无需此选项。

参考

在一个客户端上使用多个 SSH 私钥的最佳方式

我怎么能停止 ssh 提供错误的密钥


我发现当您使用 .ssh/config 指定多个键时,您需要在“主机”行中使用主机朋友名称作为“git remote add”命令的一部分。如果行是“Host stg”,那么您需要使用 git remote add user@stg:/path_to_git_repo.git "。如果您使用确切的服务器名称,例如 user@myserver.com:/path_to_git_repo.git,则配置文件不是由 git 选择的。因此,它没有正确选择私钥文件。我通过将相同的内容推送到 github 和 heroku 来尝试此操作,并且仅当您在“git remote add”中提供友好名称时才有效
我不确定 github 的主机。我找到了这个链接:gist.github.com/jexchan/2351996
如果您想为几个 git 存储库提供几个关键文件,请查看 here
您可以使用 Host remote.server.com 并继续使用原始 URL
经过两次更改后,这对我有用。如果配置文件是新的,不要忘记执行 chmod 600 ~/.ssh/config(参见 here)。如果您使用 GitHub,请将 Host gitserv 替换为 Host github.com,省略 Hostname remote.server.com,并使用 git remote add origin git@github.com:user_name/repo_name.git 添加远程。
N
Nick T

像这样的东西应该可以工作(由 orip 建议):

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

如果您更喜欢 subshell,您可以尝试以下方法(尽管它更脆弱):

ssh-agent $(ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git)

Git 将调用 SSH,它会通过环境变量找到它的代理;反过来,这将加载密钥。

或者,设置 HOME 也可以解决问题,前提是您愿意将仅包含 .ssh 目录的目录设置为 HOME;这可能包含一个 identity.pub 或一个 config file 设置 IdentityFile。


但这会将密钥永久添加为接受的 SSH 密钥,对吗?我想避免这种情况,这样 user2 就不会弄乱用户的项目。它适用于 Web 应用程序,因此使用不同的操作系统用户是不切实际的,这本来是最好的选择。
不,当 git 完成时,ssh-agent 终止,并且忘记了密钥。
此命令在 Windows git bash 上不起作用。它说意外标记'ssh-add'附近的语法错误
固定的命令行(适用于 windows 或 linux)类似于:ssh-agent bash -c 'ssh-add sshkey; git clone url'
ssh-agent $(..) 语法对我不起作用,我不确定这是如何工作的:(ba)sh 应该首先执行 $(..) 内的命令,然后运行 ssh-agent 并将输出作为参数。
H
Hamish Downer

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

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

请注意,需要 -o IdentitiesOnly=yes 以防止 SSH 默认行为发送与每个协议的默认文件名匹配的身份文件,如上述答案中所述。


我从 ls -l /home/vagrant/.ssh/git 得到 cannot run ssh -i /home/vagrant/.ssh/git: No such file or directory 虽然它存在 444 Nov 16 18:12 /home/vagrant/.ssh/git
@ted:chmod 400 /home/vagrant/.ssh/git
好的和简单的解决方案。如果您经常需要这样做,我建议您创建一个别名。
不要忘记chmod 400 <path-to-private-key-file>。否则 git 命令可能会失败,没有特殊的错误消息...
如果此答案还包括 -o IdentitiesOnly=yes 以确保使用 -i 指定的密钥(而不是来自 SSH 代理的密钥),那就太好了。
p
philfreo

其他人对 ~/.ssh/config 的建议更加复杂。它可以很简单:

Host github.com
  IdentityFile ~/.ssh/github_rsa

您还需要 IdentitiesOnly 选项。
@EnzeChi 您可以通过操作遥控器拥有多个 github 帐户:git remote add ssh://personal/org/proj.git && git remote add ssh://corporate/org/proj.git。然后你的配置看起来像 Host personal HostName github.com ... Host corporate HostName github.com
@EnzeChi 我做了类似的事情,所以我使用了 2 个不同的 ssh 密钥——一个用于获取,另一个用于推送。提取没有密码。推动确实如此。
我的工作没有 IdentitiesOnly 选项。有人可以解释为什么需要这样做吗?
不完全适合粒度。我的公司在 github 上有一个组织,我在 github 上有一个个人帐户,所以只有主机它不能很好地工作。
V
VonC

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

请参阅 Nguyễn Thái Ngọc Duy (pclouds)commit 3c8ede3(2016 年 6 月 26 日)。
(由 Junio C Hamano -- gitster --commit dc21164 中合并,2016 年 7 月 19 日)

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

core.sshCommand:

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

这意味着 git pull 可以是:

cd /path/to/my/repo/already/cloned
git config core.sshCommand 'ssh -i private_key_file' 
# later on
git pull

您甚至可以只为一个命令(例如 git clone)设置它:

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

这比设置 GIT_SSH_COMMAND 环境变量更容易,在 Windows 上,noted by Mátyás Kuti-Kreszács 将是

set "GIT_SSH_COMMAND=ssh -i private_key_file"

作品。人们应该认为这是最好的答案。发布后,将 .git/config 文件与预先复制到 /tmp 的版本进行比较会很有帮助。已创建一个新条目:sshCommand = ... 对于它的价值,我使用了 'git config core.sshCommand "ssh -i $HOME/.ssh/privatekeyfile"。
仅适用于现有的 git 目录。否则,您需要全局设置它,这并不是您真正想要的。
@Spanky您可以执行内联命令 git -c core.sshCommand="ssh -i private_key_file" clone host:repo.git,然后执行配置集 git config core.sshCommand 'ssh -i private_key_file'
这绝对是最好的答案!
这应该是最好的答案
J
Joe Block

my_git_ssh_wrapper 的内容:

#!/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_SSH=my_git_ssh_wrapper; 来简化它。 git clone git@github.com:TheUser/TheProject.git
此解决方案还涵盖了您想从没有主目录的帐户使用 git 的情况。
极好的。您也可以将这种方式用于私有服务器:GIT_SSH="git_wrapper" git clone ssh://user@server/path/to/project"
这是在 cygwin 环境中对我有用的唯一方法
A
Antony Hatchkins

总结答案和comments,设置git使用不同密钥文件然后忘记它的最佳方法,它还支持同一主机的不同用户(例如个人GitHub帐户和工作帐户),这有效在 Windows 上也是如此,是编辑 ~/.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


我对您投了反对票,因为您所说的一切都已包含在上面的答案中,而且在我看来,甚至更加清楚。例如,您为什么将 User 分别定义为 e dandv 和 workuser?
您回答了一个 4 年前没有新信息的问题,并且您声称您的答案是“最好的方法”。此外,您投反对票并骚扰其他用户删除他们的答案……只是为了让您的答案更上一层楼。
您实际上在这里有正确的想法,但这行不通。你必须使用用户'git'。问题是,你从 2012 年开始复制 thamster 的回复。
我认为这是比@thamster 更好的答案,只是因为它解释了主机别名。
我喜欢这个答案。但是,对我来说,这只有在我将 IdentitiesOnly yes 添加到我的 ssh 配置文件时才有效。
C
Community

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

您可以为每个 repo 配置它:

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

-F /dev/null 有什么作用?据我所知,这会将 configFile 从 ~/.ssh/config 默认值更改,但为什么需要这样做?确保沙盒命令?
linuxcommand.org/man_pages/ssh1.html,不指定配置文件,所以当git运行ssh时,不会传递配置文件(实际上是一种沙盒模式,只是忽略用户配置默认选项)超级用户中的原始线程有更多关于-F的信息
我一直在寻找的那个。谢谢!
用于在 kuber 环境中工作的 AAAAA+ 解决方案。谢谢!
嗨,您知道如何将其传播到子模块吗?
T
Toby Speight

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

为了做到这一点:

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


这是我心目中最“正确”的答案,您可以在 ssh 配置文件中组织连接和密钥,这是最佳实践和长期可支持的。
其他解决方案似乎是解决方法,这是使用该工具支持的强大功能。
这听起来正是我正在寻找的东西,但我无法让它工作。每当我运行 git 命令时,我都会得到:ssh: Could not resolve hostname helloworld-wp-github: Name or service not known fatal: Could not read from remote repository.
您是否在 ~/.ssh/config 中添加了新条目?这就是您告诉 ssh 您的“helloworld-wp-github”是“github.com”的别名的方式。然后,只有这样,您才能在 git 命令中使用您的别名作为远程服务器。
添加 User git 是我所缺少的。您可以使用 ssh -vT XXX ( docs.github.com/en/authentication/troubleshooting-ssh/… ) 测试连接
R
RicarHincapie

最快和最简单的方法是:

使用 ssh 克隆你的仓库:

git -c core.sshCommand="ssh -i ~/.ssh/<your_key>" clone git@github.com:<user>/<repo>.git

然后 cd 进入你克隆的回购和:

git config core.sshCommand 'ssh -i ~/.ssh/<your_key>'

要测试它是否正常工作:

git --git-dir=/path/to/repo/.git pull

所以你可能想知道:为什么我创建的 ssh 密钥在我在 github 中种植 .pub 并且私有在默认目录中之后不起作用?

documentation 为我们提供了一个澄清问题的命令:ssh -vT git@github.com

输出显示 git 查找的 ssh 密钥名称列表。因此,您可能希望使用其中一个名称创建您的密钥,或者使用上述过程来包含您需要的名称。


要添加到这一点,您应该使用 gitconfig 的另一个功能来配置它:includeif。
您可以用这个命令替换这两个命令: git clone -c "core.sshCommand=ssh -i ~/.ssh/<your_key>" git@github.com:<user>/<repo>.git 。请注意 -c 选项出现在 clone 之后,而不是之前。
L
Leo Ufimtsev
GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key" git clone $git_repo

或者

export GIT_SSH_COMMAND="ssh -i /path/to/git-private-access-key"
git clone REPO
git push

j
jackslash

像这样将该主机或 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)

这很有用,但会让您使用 repo 密钥与该主机名进行所有交互。如果同一服务器上有其他需要不同密钥的存储库,则使用包装器并告诉 git 将其与 GIT_SSH 一起使用会更好。
这不一定是真的。我为 Github 使用了多个密钥——一个用于工作,一个用于我的个人帐户。您不必为“主机”输入域名。你可以放任何你想要的别名。例如,我使用 gh-home 和 gh-work 作为我的主机名,当我克隆时,我使用 git clone git@gh-work:repo/project.git 在我的 ~/.ssh/config 中,我有两个部分都使用 github.com 作为主机名。他们只是有不同的 IdentityFile 和 Host
@brettof86 这个策略在大多数情况下都有效,但是当您检查的存储库依赖于也托管在 github 上的 gem 时,您会怎么做? Gemfile 中对 github 存储库的引用不会包含您的“别名”,除非您想为项目中的其他开发人员破坏事情...
@brettof86 我也有两个不同的 github 帐户(工作、家庭),但我无法让该示例为我工作。你能发布一个有两个的样本吗?
@Climbs_lika_Spyder 这是我的 ~/.ssh/config pastebin.com/8rYn7yCi 中的内容
c
ciego

从 Git 版本 2.10.0 开始,您可以按 repo 或全局配置它

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

这将为当前 repo 指定将使用的 ssh 密钥。我假设如果你想指定这个全局只需要设置 --global 选项。


如何指定此结帐?我的意思是,我刚刚创建了一个新的空文件夹,打开控制台,进入这个文件夹并执行了这个命令。它告诉我:fatal: not in a git directory
您需要使用 git init 初始化 git
使用 WSL2 我最初使用标准正斜杠 \ 设置了路径,包括 C:\Users 路径,但必须逐字更改它,因为您使用标准 Unix 路径语法 ~/。这对我来说非常有效,并且对设置 --global 选项的说明特别有帮助,这在大多数情况下几乎都是隐含的
F
Fábio Batista

我使用了 GIT_SSH 环境变量。这是我的包装器,类似于上面 Joe Block 的包装器,但可以处理任意数量的参数。

文件 ~/gitwrap.sh

#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"

然后,在我的 .bashrc 中,添加以下内容:

export GIT_SSH=~/gitwrap.sh

我确实在.bashrc 上设置了这个。但是当我登录到 openshift 实例时,它似乎并没有调用它。我错过了什么吗?
它对我来说失败并出现错误..虽然它在那里无法找到脚本事件..不确定发生了什么...错误:无法运行/tmp/gitwrap.sh:没有这样的文件或目录
如果您遇到“没有这样的文件或目录”错误,请输入 gitwrap.sh 的完整路径,例如 /home/ubuntu/gitwrap.sh
您可能希望将 -o StrictHostKeyChecking=no 添加到 ssh 命令
F
Fattie

2021. 如果您使用的是 Mac。

假设您在 aws 上有一个 ubuntu 服务器,您通常像这样连接到它:

% ssh -i blah/yourkeypair.pem ubuntu@test.fattie.com

在终端只是

% export GIT_SSH_COMMAND="ssh -i /Users/fattie/Desktop/blah/yourkeypair.pem"

在你这样做之后。然后就可以自由...

% git clone ubuntu@test.fattie.com:/home/ubuntu/teste.git  

这会将您服务器上的存储库克隆到您的本地文件夹“teste”,

然后,您可以在 teste/ 中自由执行常用命令,例如...

% git push origin master

等等。

--

另请注意:https://stackoverflow.com/a/67287133/294884

至于在服务器上,看来你基本上

] git clone --bare the-actual-folder teste.git

然后在 teste.git

] git init --bare --shared

适用于 WSL2 (ubuntu)
c
cgnorthcutt

如果这里的其他解决方案都不适合您,并且您创建了多个 ssh 密钥,但仍然无法执行简单的操作,例如

git pull

然后假设您有两个 ssh 密钥文件,例如

id_rsa
id_rsa_other_key

然后在 git repo 中,尝试:

# Run these commands INSIDE your git directory
eval `ssh-agent -s`
ssh-add ~/.ssh/id_rsa
ssh-add ~/.ssh/id_rsa_other_key

并通过以下方式确保您的 github 默认用户名和用户 ID 正确:

# Run these commands INSIDE your git directory
git config user.name "Mona Lisa"
git config user.email "mona.lisa@email.com"

有关详细信息,请参阅 https://gist.github.com/jexchan/2351996


请注意,如果您得到 Could not open a connection to your authentication agent.,请尝试 $ eval `ssh-agent -s`,然后再试一次。
对于那些迷路的人,ssh-add 命令技巧对我有用。将身份密钥添加到 ssh 身份验证时尝试的列表中。这对我很有效!
为什么您认为在哪个目录中运行 ssh-add 很重要?
@BenCartwright 因为您正在修改本地设置,而不是全局设置。这种方法在 repo 内修改 .git 而不是全局修改 git 程序。您可以使用 --global 设置全局用户名和电子邮件。
c
chopstik

当您需要使用正常请求 (git pull origin master) 连接到 github 时,将主机设置为 ~/.ssh/config 中的 * 对我有用,任何其他主机(例如“github”或“gb”)都不起作用.

Host *
    User git
    Hostname github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_xxx

还不如把整个“Host *”行去掉。
它可能不起作用,因为它与您的远程 URL 不匹配。如果要使用 Host my-host-alias,则必须设置 remote.origin.url=git@my-host-alias:[username]/[repo].git
P
Paul 'Joey' McMurdie

其中许多解决方案看起来很诱人。但是,我发现以下链接中的通用 git-wrapping-script 方法最有用:

How to Specify an ssh Key File with the git command

关键是没有如下 git 命令:

git -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

Alvin 的解决方案是使用一个定义明确的 bash-wrapper 脚本来填补这个空白:

git.sh -i ~/.ssh/thatuserkey.pem clone thatuser@myserver.com:/git/repo.git

其中 git.sh 是:

#!/bin/bash

# The MIT License (MIT)
# Copyright (c) 2013 Alvin Abad
# https://alvinabad.wordpress.com/2013/03/23/how-to-specify-an-ssh-key-file-with-the-git-command

if [ $# -eq 0 ]; then
    echo "Git wrapper script that can specify an ssh-key file
Usage:
    git.sh -i ssh-key-file git-command
    "
    exit 1
fi

# remove temporary file on exit
trap 'rm -f /tmp/.git_ssh.$$' 0

if [ "$1" = "-i" ]; then
    SSH_KEY=$2; shift; shift
    echo "ssh -i $SSH_KEY \$@" > /tmp/.git_ssh.$$
    chmod +x /tmp/.git_ssh.$$
    export GIT_SSH=/tmp/.git_ssh.$$
fi

# in case the git command is repeated
[ "$1" = "git" ] && shift

# Run the git command
git "$@"

我可以验证这是否解决了我在使用 git remote updategit pullgit clone 进行远程 bitbucket 存储库的用户/密钥识别时遇到的问题;所有这些现在都可以在 cron 作业脚本中正常工作,否则在有限外壳中导航时会遇到问题。我还能够从 R 中调用这个脚本,并且仍然解决了完全相同的 cron 执行问题(例如 system("bash git.sh -i ~/.ssh/thatuserkey.pem pull"))。

并不是说 R 与 Ruby 相同,但如果 R 可以做到... O:-)


看起来很棒!我将对此进行测试并回复。
除了语法之外,根据 Robert Jack Will's answer,这比 GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.git 好多少?
R
RtmY

很多很好的答案,但其中一些假设事先有管理知识。

我认为明确强调 如果您通过克隆 Web URL 开始您的项目 - https://github.com/<user-name>/<project-name>.git
那么您需要确保 {2 } .git/config [remote "origin"] 下的 value 已更改为 SSH URL(请参见下面的代码块)。

除此之外,请确保添加 sshCommmand,如下所述:

user@workstation:~/workspace/project-name/.git$ cat config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    sshCommand = ssh -i ~/location-of/.ssh/private_key -F /dev/null <--Check that this command exist
[remote "origin"]
    url = git@github.com:<user-name>/<project-name>.git  <-- Make sure its the SSH URL and not the WEB URL
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

阅读有关它的更多信息here


非常感谢,花了很多时间试图弄清楚为什么 git 不使用 ssh 密钥。我不明白为什么 github 在克隆按钮中将 https url 作为默认值。
可靠的答案,提供项目级别配置的信息,而不是系统范围的配置。其他答案似乎忽略了如果您没有系统范围的配置,您基本上只会遇到这个问题!
R
Rafael Corrêa Gomes

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

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

c
cristobal

如果您的路径上有目录要使用给定的标识文件进行签名,您可以通过设置 ControlPath 指定通过 .ssh/config 文件使用特定的标识文件,例如:

host github.com
  ControlPath ~/Projects/work/**
  HostName github.com
  IdentityFile ~/.ssh/id_work
  User git

然后 ssh 在给定工作路径下执行 git 命令时将使用指定的身份文件。


后来发现还可以设置属性ControlMaster autoControlPersist yes,这样就不用每次都重新输入密码了。在此 article 中找到信息
ControlPath 指定用于连接共享的控制套接字的路径,如上面的 ControlMaster 部分所述,或字符串“none”以禁用连接共享。在路径中,“%l”将替换为本地主机名,“%h”将替换为目标主机名,“%p”端口将替换,“%r”将替换为远程登录用户名。建议用于机会连接共享的任何 ControlPath 至少包括 %h、%p 和 %r。这确保了共享连接是唯一标识的。
实际上,这听起来像是正确使用 ControlPath 的无意副作用
P
Peyman Mahdavi

在带有 Git Bash 的 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,计算机的文件夹测试中。此外,如果您想克隆存储库,您可以将 git remote add origin 更改为 git clone

将其输入到 Git Bash 后,它会要求您输入密码!

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

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


2022 年应该没有人使用 putty。windows 现在提供适当的 ssh 支持。
M
Mike Z.

这种方法的问题是,至少在 Windows 上通过 bash.exe 运行时,它每次都会创建一个新进程,该进程将保持休眠状态。

ssh-agent bash -c 'ssh-add /somewhere/yourkey; git clone git@github.com:user/project.git'

如果您想按计划将其用于syncig repo,那么您需要在最后添加“&& ssh-agent -k”。

就像是:

ssh-agent bash -c 'ssh-add C:/Users/user/.ssh/your_key; git -C "C:\Path\to\your\repo" pull && ssh-agent -k' 

ssh-agent -k 将在完成后终止该进程。


G
Gilbert

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

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

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

.pem 文件复制到 /home/ssenyonjo/.ssh 文件夹,然后打开 /home/ssenyonjo/.ssh/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

如果您看到类似于以下内容的错误:fatal: Could not read from remote repository,则表示您访问了错误的文件夹。确保您已经概述了从根目录到创建的存储库的正确路径。

如果您不想设置配置文件但想访问需要密钥的 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 

您可以导出命令以继续将其用于其他任务,例如 git pushgit pull

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

请参阅:https://stackoverflow.com/a/29754018/10030693


M
Mátyás Kuti-Kreszács

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

set GIT_SSH_COMMAND="ssh -i private_key_file"

利用:

set "GIT_SSH_COMMAND=ssh -i private_key_file"

报价必须像

set "variable=value" 

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


g
gajanan malvade

您需要创建一个 ~/.ssh/config 如下

Host <Your bitbucket server>
User <userid>
Hostname <Your bitbucket server as above>
IdentitiesOnly yes
IdentityFile ~/.ssh/id_rsa<file> This is your private key file

权限如下

-rw------- $HOME/.ssh/config

将您的公钥添加到您的 git 中(cat ~/.ssh/id_rsa_pub [或类似名称])

然后 git clone 如下

git clone ssh://blahblah@blah.com/userid/test.git

c
codeVerine

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

用例是我需要使用 SSH 来使用个人和工作 GitHub 帐户。我想默认使用工作 SSH 密钥,因为我的项目内部将有其他工作存储库作为依赖项。所以克隆它们应该可以无缝地工作。

我遵循的步骤是:

生成默认 SSH 密钥并将其添加到工作 git 帐户。

在单独的文件中生成个人 SSH 密钥并将其添加到个人 git 帐户。

在 .bashrc 或 .zshrc 文件中添加以下函数代码并获取它。 gclone() { # 使用个人 ssh-key 克隆 repo-url git -c core.sshCommand="ssh -i path_to_personal_key" clone "$1" && # 使用 "awk" 从 URL 中提取 repo 名称并使用 " cd" cd $(awk '{ sub(/.*\//, ""); sub(/\.git.*/, ""); print }' <<< "$1") && # 设置个人ssh -key 作为这个 repo 的默认值 git config core.sshCommand "ssh -i path_to_personal_key"; }

使用 gclone 命令使用个人 SSH 密钥克隆存储库,并将存储库设置为默认使用该密钥。

使用普通的 git clone 命令克隆带有默认(工作)SSH 密钥的存储库。


F
Flimm

此命令克隆存储库并将 SSH 密钥配置为永久使用:

git clone -c "core.sshCommand=ssh -i ~/.ssh/<key>" git@github.com:<user>/<repo>.git

现在,如果您运行 git fetchgit pullgit push,它将使用在 core.sshCommand 中配置的 SSH 密钥(保存在 .git/config 中)。


s
sam-w

您可以使用 GIT_SSH 环境变量。但是您需要将 ssh 和选项包装到一个 shell 脚本中。

请参阅命令外壳中的 git 手册:man git


佚名

我使用 zsh 并将不同的密钥自动加载到我的 zsh shell 的 ssh-agent 以用于我笔记本电脑上的其他目的(即访问远程服务器)。我修改了@Nick 的答案,并将它用于我需要经常刷新的回购协议之一。 (在这种情况下,它是我的 dotfiles,无论我在哪里工作,我都希望在我的所有机器上使用相同的最新版本。)

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 存储库

如果 cd 到 repo dir 成功,从远程 repo 拉取

杀死生成的 ssh-agent。 (我不希望有很多特工徘徊。)