GitHub错误消息-权限被拒绝(公钥)


700

有人看到此错误并知道该怎么办吗?

我正在使用终端,我在根目录中,GitHub存储库存在,我现在不知道该怎么办。

> git push -u origin master
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.



1
可能是.ssh和授权密钥的权限问题。SSH非常严格,用谷歌搜索。
莫里森


就像@bdukes的答案,这里是使用https的命令,它将在Windows上正常工作:“ PS C:\ xampp \ htdocs> git clone github.com/algolia/instant-search-demo.git
Dung

Answers:


661

GitHub无法验证您的身份。因此,或者您没有设置SSH密钥,因为您尚未在计算机上进行设置,或者您的密钥未与GitHub帐户相关联。

您还可以使用HTTPS URL代替SSH / git URL,以避免必须处理SSH密钥。这是GitHub的推荐方法

此外,GitHub上有一个专门针对该错误消息帮助页面,并详细说明了您可以检查的所有内容。


53
此错误并非GitHub独有。我在使用BitBucket时遇到了相同的错误,我正在为解决该问题而挠头……
IgorGanapolsky 2014年

32
Github帮助页面上的帮助部分正在使用ssh -vT git@github.com,以帮助调试您的存储库正在使用的密钥。我建议您在答案中添加它。
MaximeBernard 2015年

25
使用HTTPS代替SSL的观点有点令人失望。SSH更加方便。上面@MaximeBernard的建议为我解决了这个问题:GIT不在.ssh目录的正确位置。使用ssh -vT git@github.com提供了许多有关为什么不起作用的信息。
Christophe

1
根据我上面的评论,第三个选项是从除具有ssh密钥的帐户(例如,以root身份运行)以外的帐户发送命令。
David LeBauer '16

1
如@ theapache64所述:如果您使用的是Mac,并且已经生成了ssh密钥,则可能确实缺少了“ ssh-add”。为我工作。
数字无常

78

您是否在〜/ .ssh目录中创建了一个配置文件?它应具有以下内容:

Host github.com 
 IdentityFile ~/.ssh/github_rsa

假设您创建了一个名为github_rsa的ssh密钥

并上传到GitHub ...

注意:如果〜/ .ssh /目录中有1个以上的键(2个或更多),则必须遵循这种显式配置方式。如果您不以这种方式指定密钥,那么将按顺序使用第一个密钥并将其用于github身份验证,因此它取决于密钥文件名。


1
我已经生成了ssh密钥,并且能够在相当长的时间内运行良好,没有任何问题。一天(可能是在重新启动之后),它停止了工作,而密钥在github和我的本地系统上是完整的。我添加了“配置文件”,指定了映射到域的键。上面在igor-ganapolsky-answer中提供的详细信息。它工作正常!
parasrish

3
这确实解决了我的问题!非常感谢!但是我有一个问题。在使用您的方法之前,请ssh -T git@github.com正确回答,同时git push -u origin master给出与问题相同的错误。为什么我可以正确连接到它,但不能推动它或从中获取?
Eden Harder

@EdenHarder我面临着同样的问题。您找到答案了吗?
Vreddhi Bhat

64

我知道这个问题。添加ssh密钥后,也将您的ssh密钥也添加到ssh代理(来自官方文档https://help.github.com/articles/generating-ssh-keys/

ssh-agent -s
ssh-add ~/.ssh/id_rsa

在此之后,一切正常,git可以查看适当的密钥,然后再执行。


5
长官!在我的MacOS X上工作
。– stillatmylinux

9
无法打开与身份验证代理的连接。
蒙娜·贾拉

尝试运行此命令:evalssh-agent -s
Vincent acent

@MonaJalal使用ssh-add ~/.ssh/github_rsa
Anirban Nag'tintinmj'18-10-31

完善。这是工作。谢谢。👌
Erkam KUCET

62

您需要生成一个SSH密钥(如果您没有SSH密钥),并将公钥与您的Github帐户相关联。请参阅Github自己的文档


2
谢谢...我现在从GitHub生成了一个SSH密钥。现在在终端中使用什么命令将两者关联起来?谢谢!
webwrks 2012年

2
没有终端命令。请参阅我在答案中链接的文档中的步骤4。
cdhowie 2012年

我使用HTTPS克隆了存储库。在这种情况下是否需要生成SSH密钥?
Pabitra Dash 2015年

@PabitraDash否。HTTPS不使用SSH密钥。
cdhowie 2015年

51

这发生在我身上。由于某种原因,我的出身被弄乱了,却没有意识到:

检查您的设置是否仍然正确

git remote -v

网址必须类似于ssh://git@github.com/YourDirectory/YourProject.git; 如果看不到git@github.com,请使用

git remote set-url origin git://github.com/YourDirectory/YourProject.git

设置正确。或者,您可以使用github应用程序在特定存储库的设置面板中检查并设置主远程存储库url。


9
小心URL。它们在https和ssh之间有所不同,此页面上的帖子并不清楚。每个git项目在项目根目录中都有一个.git / config文件。在那里您可以设置远程和分支信息。为https:url = github.com/<yourGitUserName>/<yourGitProject>.git设置远程而为git + ssh:url = git@github.com:<yourGitUserName> / <yourGitProject> .git设置错误的URL会导致公钥权限被拒绝的错误,这可能不是一个很明显的错误。
darKoram 2014年

对于我最终的情况,仅适用于该部分:git remote set-url origin github.com/your_directory/your_project.git
rld

19

假设您正在通过SSH连接GitHub,则可以运行以下命令进行确认。

$git config --get remote.origin.url

如果您得到的结果具有以下格式git@github.com:xxx / xxx.github.com.git,则应执行以下操作。

生成SSH密钥(或使用现有密钥)。如果您有,则只需将密钥添加到ssh-agent(步骤2)和GitHub帐户(步骤3)。

以下适用于没有SSH密钥的用户。

步骤1生成公共/私有rsa密钥对。

$ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

系统将要求您确认SSH密钥的保存位置以及要使用的密码。

步骤2将密钥添加到ssh-agent

  • 确保启用了ssh-agent

    $eval "$(ssh-agent -s)"

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

    $ssh-add ~/.ssh/id_rsa

步骤3将SSH密钥添加到您的帐户

$sudo apt-get install xclip

$xclip -sel clip < ~/.ssh/id_rsa.pub

然后将复制的密钥添加到GitHub

转到设置 -> SSH密钥(个人设置侧边栏)-> 添加SSH密钥 ->填写表格(密钥在剪贴板上,只需使用ctrl + v)-> 添加密钥

完成上述步骤后,您应该解决权限问题。

参考链接: 生成SSH密钥


此解决方案适用于ubuntu,$ ssh-add /root/.ssh/id_rsa
Feras

这也解决了我的环境上的一个怪异的混乱,我建议的一种修改是避免使用xclip依赖,只需使用cat ~/.ssh/id_rsa.pub
Pogrindis

19

首先,我们需要检查计算机上现有的ssh密钥。打开终端并运行:

ls -al ~/.ssh

#or

cd ~/.ssh
ls

这将列出您的.ssh目录中的文件

最后取决于您看到的内容(以我为例):

 github_rsa  github_rsa.pub known_hosts

只需尝试设置您的RSA,并希望能解决您的“ git push origin”问题

$ ssh-keygen -lf ~/.ssh/github_rsa.pub

注意: RSA证书是密钥对,因此您将拥有一个私有证书和一个公共证书,因为它属于github(在这种情况下),所以私有证书将无法访问,但是当发生此错误时,公共证书是您可能会丢失的证书(至少这是我的情况,我的github帐户或回购以某种方式弄乱了,我不得不“链接”先前生成的公钥)


我是否必须SHA从此命令将输出复制到github?
IgorGanapolsky '16

不,只需执行“ ssh-keygen -lf〜/ .ssh / <YOUR_GITHUB_RSA_FILE.pub>”
d1jhoni1b

这就是为什么我还附加了一个命令“列出.ssh目录中的文件”的原因...这样您就可以从哪个文件中提取密钥(ssh-keygen)。请记住,RSA证书是密钥对,因此您将拥有一个私有证书和一个公共证书,因为它属于github(在这种情况下),所以私有文件将不可访问,但是当发生此错误时,公共证书是您可能会丢失的证书(至少那是我的情况,我的github帐户或存储库以某种方式弄乱了,我不得不再次“链接”先前生成的公共密钥)
d1jhoni1b

$ ssh-keygen -lf〜/ .ssh / github_rsa.pub /home/mona/.ssh/github_rsa.pub:没有这样的文件或目录
Mona Jalal

“没有这样的文件或目录”表示您没有该文件名或路径...执行ls -al〜/ .ssh时会得到什么?
d1jhoni1b


11

另一个解决方案:

创建SSH密钥,键入 ssh-keygen -t rsa -C "your_email@example.com"。这将同时创建id_rsa和id_rsa.pub文件。

将id_rsa添加到本地计算机上的ssh列表中: ssh-add ~/.ssh/id_rsa.

生成密钥后,使用以下命令获取pubkey:

cat ~/.ssh/id_rsa.pub 

你会得到类似的东西:

cat ~/.ssh/id_rsa.pub 

ssh-rsa AAAB3NzaC1yc2EAAAADAQABAAACAQCvMzmFEUPvaA1AFEBH6zGIF3N6pVE2SJv9V1MHgEwk4C7xovdk7Lr4LDoqEcqxgeJftwWQWWVrWWf7q9qCdHTAanH2Q5vx5nZjLB+B7saksehVOPWDR/MOSpVcr5bwIjf8dc8u5S8h24uBlguGkX+4lFJ+zwhiuwJlhykMvs5py1gD2hy+hvOs1Y17JPWhVVesGV3tlmtbfVolEiv9KShgkk3Hq56fyl+QmPzX1jya4TIC3k55FTzwRWBd+IpblbrGlrIBS6hvpHQpgUs47nSHLEHTn0Xmn6Q== user@email.com

复制此密钥(值)并转到github.com,并在设置(ssh和pgp密钥)下添加您的公共密钥。


10

如果您不访问自己的存储库,或在克隆的存储库内进行克隆(使用一些“ git submodule ...”命令):

在存储库的主目录中:

$ ls -a

1.打开“ .gitmodules”,您将发现类似以下内容:

[submodule "XXX"]
    path = XXX
    url = git@github.com:YYY/XXX.git

将最后一行更改为您需要提取的存储库的HTTPS

[submodule "XXX"]
    path = XXX
    https://github.com/YYY/XXX.git

保存“ .gitmodules”,然后运行子模块的命令,“。git”将被更新。

2.打开“ .git”,转到“ config”文件,您将找到以下内容:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/YYY/XXX.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[submodule "XXX"]
    url = git@github.com:YYY/XXX.git

将最后一行更改为您需要提取的存储库的HTTPS

    url = https://github.com/YYY/XXX.git

因此,在这种情况下,主要问题只是URL。现在可以在存储库页面顶部找到任何存储库的HTTPS。


9

这为我工作:

1-删除所有起源

git remote rm origin  

(请参阅https://www.kernel.org/pub/software/scm/git/docs/git-remote.html

* remote:“管理要跟踪其分支的存储库集(“远程”)。

* rm:“删除名为的遥控器。将删除该遥控器的所有远程跟踪分支和配置设置。”

2-检查所有已删除:

git remote -v  

3-添加新的原始母版

git remote add origin git@github.com:YOUR-GIT/YOUR-REPO.git

那是所有人!


1
这很有帮助。通过这些命令,它开始询问我github用户名和帐户密码,之后我可以通过在终端中键入轻松推送到github链接:git push -u origin master
Noha Salah

8

确保ssh-add -l显示Github帐户的SSH密钥列表中存在的SSH密钥的指纹。

如果输出为空,但是您知道您有一个可以与github帐户一起使用的SSH专用密钥,请ssh-add在该密钥上运行(位于中~/.sshid_rsa默认情况下已命名,因此您可能会运行ssh-add id_rsa)。

否则,请按照以下说明生成SSH密钥对。


8

我之前在我的php项目中使用github。在使用github时,我使用的是ssh而不是https。我已经设置好机器,每次我提交并推送代码时,都会询问我rsa密钥密码。

几天后,我停止了php项目的工作,忘记了rsa密码​​。最近,我开始从事Java项目,并移到了bitbucket。从那时起,我忘记了密码,无法恢复密码我想,所以我决定对新项目使用https(推荐)协议,并在问题中遇到了相同的错误。

我怎么解决的?

  1. 跑此命令告诉我的git使用https而不是ssh:

    git config --global url."https://".insteadOf git://
    
  2. 删除任何遥控器(如果有)

    git remote rm origin
    
  3. 重做从git initgit push的所有内容,一切正常!

PS:在调试过程中,我还从计算机上卸载了ssh,以为删除它可以解决问题。是的我知道!!:)


我认为在ssh也应该起作用的情况下,将人们指向https是一个好主意。而且,这不太可能为公司代理背后的人们所用。
伊戈尔·斯托帕

8

如果将ssh访问权限更改为对远程存储库的https访问权限,则问题已解决:

git remote set-url origin https_link_to_repository

git push -u origin master

5

我认为我对您来说是最好的答案,您的git应用程序会在根用户目录中读取id_rsa.pub

/home/root/.ssh/id_rsa.pub

这就是为什么git无法读取/home/your_username/.ssh/id_rsa.pub中的密钥的原因。因此,您需要在/home/root/.ssh/中创建密钥

$ sudo su
$ ssh-keygen
$ cd ~/.ssh
$ cat id_rsa.pub

然后将密钥复制到您的github帐户中。对我有用。你可以尝试一下。


这使我能够找到想要的答案。我从习惯上使用sudo运行克隆,所以它正在寻找错误的凭据。脱掉须藤,我的克隆运转良好。
Taekahn

4

如果您已经创建了SSH密钥,但仍然出现错误,那是因为您需要授予用户读取和写入要克隆到的文件夹的权限。去做这个,sudo chmod 777 <your_folder_name_here>"。当然,这是在生成SSH密钥之后,您仍然会收到此错误。希望这对将来的用户有所帮助。

编辑

如果您使用的是git bash,则要在Windows中使用admin进行添加


这个。这也可能导致问题。
KevinO

1
这是我的问题,但我不建议您在文件夹上设置777权限。在我的情况下,该文件夹归root用户所有,我需要授予该文件夹对我的非root用户帐户的访问权限。我这样做是这样的:sudo chown -R $USER:$USER <your_folder_name_here>
David

@David,我也建议这么做。777十分hacky,并不安全。
凯文(Kevin)

3

我最近有同样的问题。如果您需要立即修复,这可能会有所帮助,但是每次重新启动系统时都需要这样做。

从终端运行: ssh-add ~/.ssh/id_rsa

输入您的系统密码,这样就可以了。


3

我想补充一些发现:

如果使用GitBash,请确保SSH密钥存储在~/.ssh/id_rsa

默认情况下,GitBash搜索~/.ssh/id_rsaSSH密钥的默认路径。

甚至文件名也很id_rsa重要。如果将SSH密钥保存在另一个文件名或路径中,它将引发Permission Denied(publickey)错误。


3

好的,对此解决方案很少,可能已经提到其中一些解决方案,但只是为了使它们保持一致:

  • 确保您的密钥存在,默认情况下为另一个〜/ .ssh /文件夹,即id.rsa和id.rsa.pub

  • 确保密钥具有正确的权限,可以运行chmod:

    chmod 600〜/ .ssh / id_rsa

    chmod 644〜/ .ssh / id_rsa.pub

  • 确保您的公钥(id_rsa.pub)的内容与远程存储库配置中上传的内容匹配

  • 最后解决ssh代理的问题: ssh-add

一些更多信息:https : //itcodehub.blogspot.com/2015/01/ssh-add-problems-with-ssh-agent-and.html


我已使用格式化为FAT32的USB驱动器将ssh密钥从一台计算机复制到另一台计算机。那改变了文件的权限。在Ubuntu上,我习惯于在需要时自动要求输入SSH密码,但是直到我按照chmod您的描述运行时,它才默默地发生。谢谢。
lydell

1

如果您使用GitHub for Mac UI,请检查首选项以确保您已登录。


1

在“ git push”期间出现相同的错误。在客户端,我有两个来源和主人。我删除了一个,然后工作正常。


1

您可以使用Https网址登录

我猜您在说git push时尝试使用ssh url登录,如果仅询问密码就认为您正在通过ssh连接。更好地使用http url。


1

同样在ubuntu中,即使在BitBucket的设置中已经输入了SSH密钥,我还是遇到了这个问题。原因是,我正在尝试以下操作:

sudo git push origin master

不知道为什么,但是通过使用它解决了

git push origin master

不使用sudo。


1

对我来说,我尝试过-

eval "$(ssh-agent -s)"

然后我跑

ssh-add ~/.ssh/path-to-the-keyfile

为了生成密钥,您可以运行

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

这将生成一对密钥(公共密钥和私有密钥)。

您可以将该密钥存储到github以获取更多信息,请阅读以下内容向您的GitHub帐户添加新的SSH密钥

我希望它会帮助其他人:)


1

我遇到了与@Batman类似的问题。但是,由于我是在/ usr / local / src / projectname下运行此程序,因此不选择不使用sudo运行是不可能的。

只需添加-E标志以预设环境(您的〜/ .ssh /路径)。

$ sudo -E git clone git@your_repo

来自man sudo:

-E,--preserve-env向安全策略指示用户希望保留其现有环境变量。如果用户无权保护环境,则安全策略可能会返回错误。


1

创建存储库后,您会按照GitHub的说明进行操作。Git会指导您添加类似这样的遥控器。

git remote add origin git@github.com:<user>/<project>.git

将<>中的内容替换为与您的帐户相关的值。

解决方法是删除.git后缀。如下添加遥控器:

git remote add origin git@github.com:<user>/<project>


1

tl; dr

~/.ssh/config

PubkeyAcceptedKeyTypes=+ssh-dss

方案 如果您使用的版本是openSSH> 7,例如在MacBook Pro触摸板上说ssh -V
OpenSSH_7.4p1, LibreSSL 2.5.0

您还拥有一台较旧的Mac,最初将您的密钥放到Github上,可能使用的是id_dsa密钥。默认情况下,OpenSSH v7不使用这些DSA密钥(包括this ssh-dss),但是您仍然可以通过将以下代码放入您的代码中来重新添加它~/.ssh/config

PubkeyAcceptedKeyTypes=+ssh-dss

为我工作的消息来源是此Gentoo新闻通讯

现在,您至少可以使用GitHub,然后将密钥固定为RSA。


1

我在搜索git pull远程主机上使用的类似错误消息的解决方案时找到了此页面:

$ git pull
Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我通过连接从本地计算机连接到远程主机ssh -AY remote_hostname。这不是OP的问题的解决方案,但对遇到此页面的其他人很有用,因此请在此处发布。

请注意,在我的情况下,git pull在我的本地计算机上可以正常工作(也就是说,已经设置了ssh密钥,并将其添加到GitHub帐户等)。我通过将其添加到~/.ssh/config笔记本电脑上解决了我的问题:

Host *
     ForwardAgent yes

然后,我使用重新连接到远程主机ssh -AY remote_hostnamegit pull现在可以工作了。配置中的更改使我可以将ssh密钥对从本地计算机转发到任何主机。在该ssh会话中实际转发它的-A选项ssh在此处查看更多详细信息。



0

转到GitHub帐户仪表板,找到您的项目存储库,单击“设置”选项卡-在“ 部署密钥”下,您必须添加SSH密钥。打开终端并输入:

cat ~/.ssh/id_rsa.pub | pbcopy 

这将从您的id_rsa.pub文件中复制密钥。因此,只需返回到GitHub仪表板,将其粘贴,单击“ 添加密钥”即可

相同的解决方案适用于Bitbucket帐户。

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.