可能是一种相当不寻常的情况,但我想指定一个私有 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
连接到远程服务器的示例,但这是一个本地命令。可能吗?
ssh
这样的 -i
选项。
git config core.sshCommand 'ssh -i private_key_file'
。请参阅my answer below
这些解决方案都不适合我。
相反,我详细说明了@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 提供错误的密钥
像这样的东西应该可以工作(由 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-agent bash -c 'ssh-add sshkey; git clone url'
ssh-agent $(..)
语法对我不起作用,我不确定这是如何工作的:(ba)sh 应该首先执行 $(..)
内的命令,然后运行 ssh-agent 并将输出作为参数。
从 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
chmod 400 <path-to-private-key-file>
。否则 git 命令可能会失败,没有特殊的错误消息...
-o IdentitiesOnly=yes
以确保使用 -i
指定的密钥(而不是来自 SSH 代理的密钥),那就太好了。
其他人对 ~/.ssh/config
的建议更加复杂。它可以很简单:
Host github.com
IdentityFile ~/.ssh/github_rsa
IdentitiesOnly
选项。
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
IdentitiesOnly
选项。有人可以解释为什么需要这样做吗?
使用 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 -c core.sshCommand="ssh -i private_key_file" clone host:repo.git
,然后执行配置集 git config core.sshCommand 'ssh -i private_key_file'
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="git_wrapper" git clone ssh://user@server/path/to/project"
总结答案和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
。
IdentitiesOnly yes
添加到我的 ssh 配置文件时才有效。
如此处所述: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
默认值更改,但为什么需要这样做?确保沙盒命令?
问题是当您在同一主机(例如 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) 现在您可以使用右键自动推送、获取...。
git
命令时,我都会得到:ssh: Could not resolve hostname helloworld-wp-github: Name or service not known fatal: Could not read from remote repository.
User git
是我所缺少的。您可以使用 ssh -vT XXX
( docs.github.com/en/authentication/troubleshooting-ssh/… ) 测试连接
最快和最简单的方法是:
使用 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 密钥名称列表。因此,您可能希望使用其中一个名称创建您的密钥,或者使用上述过程来包含您需要的名称。
git clone -c "core.sshCommand=ssh -i ~/.ssh/<your_key>" git@github.com:<user>/<repo>.git
。请注意 -c
选项出现在 clone
之后,而不是之前。
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
像这样将该主机或 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 clone git@gh-work:repo/project.git
在我的 ~/.ssh/config 中,我有两个部分都使用 github.com 作为主机名。他们只是有不同的 IdentityFile 和 Host
~/.ssh/config
pastebin.com/8rYn7yCi 中的内容
从 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
。
\
设置了路径,包括 C:\Users
路径,但必须逐字更改它,因为您使用标准 Unix 路径语法 ~/
。这对我来说非常有效,并且对设置 --global
选项的说明特别有帮助,这在大多数情况下几乎都是隐含的
我使用了 GIT_SSH 环境变量。这是我的包装器,类似于上面 Joe Block 的包装器,但可以处理任意数量的参数。
文件 ~/gitwrap.sh
#!/bin/bash
ssh -i ~/.ssh/gitkey_rsa "$@"
然后,在我的 .bashrc 中,添加以下内容:
export GIT_SSH=~/gitwrap.sh
gitwrap.sh
的完整路径,例如 /home/ubuntu/gitwrap.sh
-o StrictHostKeyChecking=no
添加到 ssh 命令
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
如果这里的其他解决方案都不适合您,并且您创建了多个 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
很重要?
.git
而不是全局修改 git 程序。您可以使用 --global
设置全局用户名和电子邮件。
当您需要使用正常请求 (git pull origin master
) 连接到 github 时,将主机设置为 ~/.ssh/config
中的 *
对我有用,任何其他主机(例如“github”或“gb”)都不起作用.
Host *
User git
Hostname github.com
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa_xxx
Host my-host-alias
,则必须设置 remote.origin.url=git@my-host-alias:[username]/[repo].git
。
其中许多解决方案看起来很诱人。但是,我发现以下链接中的通用 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 update
、git pull
和 git clone
进行远程 bitbucket 存储库的用户/密钥识别时遇到的问题;所有这些现在都可以在 cron
作业脚本中正常工作,否则在有限外壳中导航时会遇到问题。我还能够从 R 中调用这个脚本,并且仍然解决了完全相同的 cron
执行问题(例如 system("bash git.sh -i ~/.ssh/thatuserkey.pem pull")
)。
并不是说 R 与 Ruby 相同,但如果 R 可以做到... O:-)
GIT_SSH_COMMAND="ssh -i ~/.ssh/thatuserkey.pem" git clone clone thatuser@myserver.com:/git/repo.git
好多少?
很多很好的答案,但其中一些假设事先有管理知识。
我认为明确强调 如果您通过克隆 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 clone。
ssh-add ~/.ssh/id_rsa_mynewkey
git clone git@bitbucket.org:mycompany/myrepo.git
如果您的路径上有目录要使用给定的标识文件进行签名,您可以通过设置 ControlPath
指定通过 .ssh/config 文件使用特定的标识文件,例如:
host github.com
ControlPath ~/Projects/work/**
HostName github.com
IdentityFile ~/.ssh/id_work
User git
然后 ssh
在给定工作路径下执行 git 命令时将使用指定的身份文件。
在带有 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!
这种方法的问题是,至少在 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 将在完成后终止该进程。
这里给出的大多数答案都没有解释最基本的用法的细节。
在云中设置服务器(在本例中为 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 push
和 git pull
export GIT_SSH_COMMAND='ssh -i ~/Projects/aws/keys/aws_ubuntu.pem'
请参阅:https://stackoverflow.com/a/29754018/10030693
让 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
您需要创建一个 ~/.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
这是@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 密钥的存储库。
此命令克隆存储库并将 SSH 密钥配置为永久使用:
git clone -c "core.sshCommand=ssh -i ~/.ssh/<key>" git@github.com:<user>/<repo>.git
现在,如果您运行 git fetch
、git pull
或 git push
,它将使用在 core.sshCommand
中配置的 SSH 密钥(保存在 .git/config
中)。
您可以使用 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。 (我不希望有很多特工徘徊。)
Host remote.server.com
并继续使用原始 URLchmod 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
添加远程。