使用Git时如何解决权限被拒绝(公钥)错误?


631

我在Mac Snow Leopard上并已安装git

我刚试过

git clone git@thechaw.com:cakebook.git

但这给了我这个错误:

Initialized empty Git repository in `/Users/username/Documents/cakebook/.git/`
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

我想念什么?
我也尝试ssh-keygen了没有阶段但仍然存在相同错误的情况。


8
您是否尝试上传通过ssh-keygen生成的公钥?
Patrick Cornelissen

我的问题是我尝试从克隆sudo-这是另一个具有另一个公钥的用户。
Vitaly Zdanevich 2015年

同样的错误。我以前通过github创建了一个公共密钥,然后使用该ssh-keygen实用程序生成了另一个密钥对。在github上的个人设置中删除旧的公共密钥,并将我的ssh生成的id_rsa.pub密钥添加到SSH和GPG密钥中,从而解决了克隆权限问题。
Tanner Dolby

Answers:


774

如果用户之前未生成ssh公用/专用密钥对

该信息在theChaw上有效,但可以应用于支持SSH pubkey身份验证的所有其他git存储库。(例如,请参见gitolite,gitlab或github。)

首先,请设置您自己的公钥/私钥对集。它可以使用DSA或RSA,因此基本上您设置的任何密钥都可以使用。在大多数系统上,您可以使用ssh-keygen。

  • 首先,您需要CD进入.ssh目录。打开终端并运行:

    cd ~/.ssh && ssh-keygen

  • 接下来,您需要将此复制到剪贴板。
    • 在OS X上运行: cat id_rsa.pub | pbcopy
    • 在Linux上运行: cat id_rsa.pub | xclip
    • 在Windows上(通过Cygwin / Git Bash)运行: cat id_rsa.pub | clip
  • 通过网站将密钥添加到您的帐户。
  • 最后设置您的.gitconfig。
    • git config --global user.name "bob"
    • git config --global user.email bob@... (不要忘记重新启动命令行以确保重新加载了配置)

就是这样,您应该很好地克隆和签出。

有关更多信息,参见https://help.github.com/articles/generating-ssh-keys(感谢@Lee Whitney)-

如果用户之前已生成ssh公用/专用密钥对

  • 检查您的github或gitlab帐户设置中已授权的密钥
  • 确定必须从本地计算机关联哪个对应的私钥

eval $(ssh-agent -s)

  • 定义按键的位置

ssh-add ~/.ssh/id_rsa


6
好。这实际上不是git,而是ssh同步问题。我对Assembla也有同样的看法,您的链接帮助我解决了这个问题。谢谢 !
Alexandre Bourlier 2012年

这个答案很有用,但是如果您从头开始生成密钥,这似乎更完整,更简单:help.github.com/articles/generating-ssh-keys
whitneyland 2014年

6
我遇到了Keygen问题。它对全局env变量中的电子邮件地址敏感。如果您遇到此问题,则需要在第一步中为您的github帐户指定电子邮件地址:ssh-keygen -t rsa -C“ your_email@youremail.com”
melchoir55

30
如果仍然无法解决问题,则需要ssh-add ~/.ssh/id_rsa
Michael Litvin

1
xclip在Linux上使用复制只能通过执行以下操作xclip -sel clip < ~/.ssh/id_rsa.pub来工作,该操作在此处列出:help.github.com/articles/generating-ssh-keys
Pat Migliaccio

217

可以使用以下方法完成更广泛的故障排除甚至自动修复:

ssh -vT git@github.com

资料来源:https : //help.github.com/articles/error-permission-denied-publickey/


1
我的问题与服务器的其他密钥有关。一旦使用上述命令确定了问题,就将IdentifyFile修复了我的配置文件,它开始工作了。
Jarie Bolander 2015年

1
显示了github试图使用哪个密钥进行身份验证。v有帮助
cdosborn

9
这不能解决任何问题。我仍然在OP的问题中得到错误。
IgorGanapolsky

5
该命令可以帮助您解决问题,这不是“此功能对我如此神奇的切换”。
stevek '17

2
我不能说这解决了任何事情,但这是一个有趣的命令,并且可以与GitHub Enterprise一起使用。
Hack-R

164

当您访问SSH URL(读/写)而不是Git只读URL时,可能会发生此错误,但是您对该存储库没有写权限。

有时,您只想克隆自己的存储库,例如,部署到服务器。在这种情况下,您实际上仅需要只读访问权限。但是由于这是您自己的存储库,因此如果您愿意,GitHub可能会显示SSH URL。在这种情况下,如果远程主机的公共密钥不在GitHub SSH密钥中,则将拒绝您的访问,这将有望发生

一个等效的情况是,当您尝试克隆没有使用SSH URL的写访问权的其他用户的存储库时。

简而言之,如果您打算仅克隆存储库,请使用HTTPS URLhttps://github.com/{user_name}/{project_name}.git)而不是SSH URL(git@github.com:{user_name}/{project_name}.git),从而避免了(不必要的)公共密钥验证。


更新:GitHub现在显示HTTPS为默认协议,此举可能会减少SSH URL的滥用。


使用https://github.comgit url时,它仍然显示SSL certificate problem: self signed certificate in certificate chaingit -c http.sslVerify=false clone ...似乎是危险的举动。Chrome不会发出任何ssl警告。有什么想法吗?
杰森·克莱本

1
@ uosɐſ很抱歉,但我从未遇到过此问题。也许要做的第一件事是从另一台计算机尝试相同的命令,看看问题是否仍然存在。
kavinyao 2014年

1
这也为我做到了。谢谢。为了将git repo克隆到共享主机帐户(1and1)上,我必须使用 git clone https://github.com/MyUserName/MyRepo.git Github页面右侧的repo URL下方的文本链接,其中显示“ 您可以使用HTTPS,SSH或Subversion进行克隆 ”。 ”。(单击HTTPS以获取链接,而不是默认的SSH。)
Oliver Schafeld,2015年

谢谢!!!!!!
Sharl Sherif

极好的答案。最后有人解释了为什么会这样。
Qback

104

github帮助链接帮助我解决了这个问题。看起来ssh密钥未添加到ssh-agent中。这就是我最终要做的。

指令1:

确保已启用ssh-agent。该命令在后台启动ssh-agent:

eval "$(ssh-agent -s)"

指令2:

将您的SSH密钥添加到ssh-agent中:

ssh-add ~/.ssh/id_rsa

7
将OSx El Capitan升级到Sierra后,这对我有用。
Louwki

7
升级到macOS Sierra后为我工作=)
Adriano Resende

这对我在Raspberry Pi上有效,显然ssh-add带有“ -k”标志而不是“ -K”。但是,一旦添加了部署密钥,便能够使用其SSH链接成功克隆我的存储库。
乔什(Josh)

34

得到了相同的错误报告。

通过使用HTTP修复。由于我不想为测试PC设置“ SSH密钥”。

克隆时将URL更改为HTTP:

git clone https://github.com/USERNAME/REPOSITORY.git

我的问题有点不同:使用以下方法将现有的本地存储库添加到远程时,设置了URL:

git remote add origin ssh://github.com/USERNAME/REPOSITORY.git

要解决此问题,请将URL重置为HTTP:

git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

顺便说一句,您可以使用以下命令检查您的URL:

git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

希望这会帮助像我这样的人。:D



21

请注意(至少对于某些项目而言),您必须具有带有ssh key的github帐户

查看身份验证代理中列出的密钥(ssh-add -l
(如果看不到任何密钥,请使用ssh-add / path / to / your / key添加现有密钥之一(例如:ssh-add〜 /.ssh/id_rsa))
(如果没有任何键,请先创建一个。请参阅:http : //rcsg-gsir.imsb-dsgi.nrc-cnrc.gc.ca/documents/internet/node31.html或只是谷歌ssh-keygen)

要验证您是否具有与github帐户关联的密钥

前往:https//github.com/settings/ssh

您应该看到至少一个键和一个散列键与一分钟前键入ssh-add -l时看到的哈希值匹配的键。

如果不这样做,请添加一个,然后重试。


这对我有用。这是发生在我身上的,因为我的密钥没有添加到auth代理中。谢谢。
antonD

19

我一直在做同样的问题,我能够克隆回购协议。对于iMac,我遵循了以下过程。

第一步:检查我们是否已经拥有公共SSH密钥。

  1. 打开终端。
  2. 输入ls -al ~/.ssh以查看是否存在现有的SSH密钥:

检查目录列表以查看是否已经有公共SSH密钥。默认公共密钥是以下d_dsa.pub,id_ecdsa.pub,id_ed25519.pub,id_rsa.pub之一

如果找不到,请转到步骤2,否则请执行步骤3

第2步:生成公共SSH密钥

  1. 打开终端。
  2. 使用您用于github的有效电子邮件地址输入followong命令 ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  3. 您将在terminal中看到以下内容Generating public/private rsa key pair。当提示您"Enter a file in which to save the key,"按Enter时。这接受默认文件位置。当提示您Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter]再次按Enter时。在提示符下,键入一个安全密码。
  4. Enter passphrase (empty for no passphrase): [Type a passphrase]如果您不想Enter same passphrase again: [Type passphrase again]再次按Enter ,请按Enter

这将产生 id_rsa.pub

步骤3:将SSH密钥添加到ssh-agent

  1. 终端类型 eval "$(ssh-agent -s)"
  2. 将您的SSH密钥添加到ssh-agent。如果使用现有的SSH密钥而不是生成新的SSH密钥,则需要使用现有的私有密钥文件的名称替换命令中的id_rsa。输入此命令$ ssh-add -K ~/.ssh/id_rsa

现在复制SSH密钥,并将其添加到您的github帐户中

  1. 在终端中,输入带有ssh文件名的命令,pbcopy < ~/.ssh/id_rsa.pub这会将文件复制到剪贴板。现在打开您的github帐户。转到“设置”>“ SSH和GPG密钥”>“新建SSH密钥”,输入标题并粘贴剪贴板中的密钥并保存。瞧,您完成了。

2
Windows用户通过以下方式复制:cat〜/ .ssh / id_rsa.pub | 剪辑
Fabii '17

1
最后,在这里和那里阅读了一个小时之后,逐步解决方案....效果很好。请记住,在步骤中将您的github密码添加为密码短语,否则每次都必须手动添加
Afshin Ghazi

13

我的情况略有不同,我登录到远程服务器并在服务器上使用git,当我运行任何git命令时,我得到的都是相同的消息

   Permission denied (publickey).
   fatal: The remote end hung up unexpectedly

我修复它的方法是在Mac上更改文件/ etc / ssh_config。从

ForwardAgent no 

ForwardAgent yes

尝试从VirtualBox VM中从github提取gem时发生错误。更新了我的Vagrantfile以使用config.ssh.forward_agent = true,重新启动了VM,现在它可以工作了。
克里斯·布鲁姆

1
根据此信息,就安全性而言,它可能不是最佳选择: heipei.github.io/2015/02/26/…–
爸爸

13

我遇到了同样的问题,因为我被认为SSHHTTPS之间的区别是

https://github.com/USERNAME/REPOSITORY.git

ssh://github.com/USERNAME/REPOSITORY.git

所以,我从改为HTTPSSSH只是通过改变https://ssh://没事就网址的结尾被改变。

但事实是:

https://github.com/USERNAME/REPOSITORY.git

git@github.com:USERNAME/REPOSITORY.git

这意味着我改变ssh://github.com/USERNAME/REPOSITORY.gitgit@github.com:USERNAME/REPOSITORY.git它的工作原理。

愚蠢的错误,但希望能对某人有所帮助!


是的,我改成ssh://github.com/USERNAME/REPOSITORY.gitgit@github.com:USERNAME/REPOSITORY.git它。
胡锦涛

当然。我只是说我看不到提到https的意思;)
OneCricketeer 2016年

我看到了,因为我只是使用ssh而不是,https所以我只是将'https://'更改为'ssh://`,所以我得到了错误。因此,改变'SSH://混帐/../'到' git的@ .. /”。)编辑我的答案
威廉·胡

这个对我有用。非常感谢你!我尝试过https,然后尝试ssh,但它仍然拒绝我的访问,直到使用“ git clone git@github.com:/myusername/myproject.git”使其成为自己的方式为止。
Thach Van

6

在Windows上,确保所有应用程序在HOME上均一致。Msys不会为您做到这一点。我必须设置一个环境变量,因为ssh和git似乎无法在我的.ssh目录所在的位置上达成一致。


6

您是否在公司环境中?您的系统变量最近是否有变化?根据这个答案,ssh键位于%HOMEDRIVE%%HOMEPATH%\.ssh\id_rsa.pub。因此,如果%HOMEDRIVE%最近更改过,git不会知道在哪里寻找您的密钥,因此也不知道所有身份验证内容。

尝试跑步ssh -vT git@github.com。请注意的identity file位置。对我而言,这并非正常\Users\MyLogin,而是一个网络驱动器,因为更改在网络层面推动环境变量。

解决方案?由于我的新文件%HOMEDRIVE%具有与本地文件相同的权限,因此我只将.ssh文件夹移到了那里,并称之为一天。


这项工作对我来说。昨天我的ssh密钥起作用了,但是今天系统的某些设置被更改了。我只是再次添加了shh键,它现在可以正常工作了。
Hitesh Agarwal '18

6

伙计们,这是如何为我工作的:

  1. 打开终端并转到用户[查看附件图像]
  2. 打开.ssh文件夹,并确保它没有像id_rsa或id_rsa.pub这样的任何文件,否则有时它无法正确重写文件
  3. git --version [检查git的安装和版本]
  4. git config --global user.email“您的电子邮件ID”
  5. git config --global user.name“您的名字”
  6. git config --list [确保已设置名称和电子邮件地址]
  7. 光盘〜/ .ssh
  8. ssh-keygen,提示保存文件,允许
  9. cat〜/ .ssh / id_rsa.pub [访问您的公共密钥并将密钥复制到Gerrit设置]

注意:您不应在Git中使用sudo命令。如果您有很好的理由必须使用sudo,那么请确保在每个命令中都使用sudo(这时最好使用su将shell作为root来使用)。如果您生成不带sudo的SSH密钥,然后尝试使用sudo git push之类的命令,则不会使用与生成的密钥相同的密钥

在此处输入图片说明

在此处输入图片说明


5

基本的GIT指令未引用SSH密钥。通过上面的某些链接,我找到了一个git帮助页面,该页面逐步解释了如何针对各种操作系统执行此操作(该链接将检测到您的操作系统并进行相应的重定向):

http://help.github.com/set-up-git-redirect/

它遍历了GITHub所需的所有内容,并给出了详细的解释,例如“为什么在创建RSA密钥时添加密码短语”。我想我会发布它,以防它帮助别人...




3

如果您有多个钥匙,则可能需要做 ssh-add private-keyfile


非常感谢!这确实是我的问题。
GoGreen

[root @ li566-238 hanjiyun]#ssh-add private-keyfile private-keyfile:没有这样的文件或目录
JY Han

3

我遇到此错误是因为我需要给我当前的工作目录权限700:

chmod -R 700 /home/ec2-user/

3

我必须将ssh密钥复制到根文件夹。运行Ubuntu 18.04的Google Cloud Compute Engine

sudo cp ~/.ssh/* /root/.ssh/

2

我在设置当前项目时遇到了这个问题,以上解决方案均无效。所以我尝试使用ssh -vT git@github.com命令查看调试列表上的实际情况。我注意到我的私钥文件名不在列表中。因此将私钥文件名重命名为'id_rsa'即可完成工作。希望这会有所帮助。


当你在案件没有帮助的使用为别的了“id_rsa”键....
random_user_name

2

它非常简单。输入以下命令

ssh-keygen -t rsa -b 4096 -C "youremailid@yourdomain.com"

生成SSH密钥。打开文件并复制内容。转到GitHub设置页面,然后单击SSH密钥。单击添加新的SSH密钥,然后将内容粘贴到此处。就是这样:)您不应再看到此问题。


1

我收到类似的权限被拒绝(公钥)错误尝试运行Makefile时。

作为上述SSH步骤的替代方法,您可以安装Mac的本机GitHub应用程序。

点击从- 下载Mac的GitHub- https://help.github.com/articles/set-up-git#platform-mac

使用git hub帐户完成设置后(我还安装了git hub命令行工具,但不确定是否需要此步骤),然后我收到了一封电子邮件-

[GitHub]新的公钥已添加到您的帐户

而我的错误已修复。


1

我遇到了同样的错误。我的问题是在sudo中混音。

如果不使用sudo前缀git clone命令,就无法创建要自动克隆到的目录。但是,当我这样做时,我的ssh密钥没有被正确引用。

为了解决这个问题,我通过chmod在想要包含克隆的父目录上设置了权限,以便可以对其进行写入。然后我跑了git clone而没有sudo前缀。然后成功了!之后,我又更改了权限。做完了


1

我收到此错误是因为我用错误的电子邮件生成了ssh密钥。我能够使用ssh进行连接,但无法使用git。解决方案是使用我的github帐户的主要电子邮件地址重新生成密钥。


1

它为我工作。

您的公钥将保存到id_rsa.pub;文件中,并且是您上传到帐户中的密钥。您可以通过运行以下命令将此密钥保存到剪贴板:

pbcopy <〜/ .ssh / id_rsa.pub

  • 将SSH密钥复制到剪贴板,然后返回Web门户。
  • 在“ SSH密钥”字段中,粘贴您的SSH密钥。
  • 在名称字段中,为密钥提供一个名称。
  • 救 。


1

当您尝试使用其他用户名推送到存储库时,最简单的解决方案是:

 git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git


1

就我而言,我已经重新安装了ubuntu,并且用户名已从以前的更改。在这种情况下,生成的ssh密钥也不同于前一个。

通过仅在存储库中复制当前的ssh公钥即可解决该问题。该密钥将在您用户的/home/.ssh/id_rsa.pub


1

在我的MAC中,我通过以下方法解决了这个问题:

cp ~/.ssh/github_rsa ~/.ssh/id_rsa

由于某种原因,我的git停止了在 github_rsa文件中。这发生在特定的回购中。我的意思是,在其他存储库中,git保持正常运行。

我认为这是一个错误。

我可以发现这种行为正在运行 ssh -vT git@github.com

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.