ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我正在使用终端,我在根目录下,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.
可能是 .ssh 和授权密钥的权限问题。 ssh 很严格,google 一下。
就像@bdukes 的答案一样,这里是使用 https 的命令,它会起作用,Windows 示例:“PS C:\xampp\htdocs> git clone github.com/algolia/instant-search-demo.git

b
bdukes

GitHub 无法对您进行身份验证。因此,要么您没有设置 SSH 密钥,因为您没有 set one up on your machine,要么您的密钥未与您的 GitHub 帐户关联。

您还可以使用 HTTPS URL 而不是 SSH/git URL,以避免处理 SSH 密钥。这是GitHub's recommended method

此外,GitHub 有一个 help page specifically for that error message,并更详细地解释了您可以检查的所有内容。


此错误并非 GitHub 独有。我在使用 BitBucket 时遇到了同样的错误,我正在为如何解决它而摸不着头脑......
帮助部分是使用 Github help page 中的 ssh -vT git@github.com 来帮助调试您的存储库使用的密钥。我建议您将其添加到您的答案中。
使用 HTTPS 而不是 SSL 的赞成票有点令人失望。 SSH 要方便得多。上面@MaximeBernard 的建议为我解决了这个问题:GIT 没有为 .ssh 目录寻找正确的位置。使用 ssh -vT git@github.com 提供了很多关于它为什么不起作用的信息。
根据我上面的评论,第三种选择是命令是从具有 ssh 密钥的帐户以外的帐户发送的(例如,以 root 身份运行)。
正如@theapache64 所提到的:如果您在Mac 上并且已经生成了一个ssh 密钥“ssh-add”可能确实是您所缺少的。为我工作。
S
SwissCodeMen

我知道这个问题。添加 ssh 密钥后,也将您的 ssh 密钥添加到 ssh 代理(来自官方 docs

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

一切正常后,git可以查看正确的密钥,之前不能。


长官!在我的 MacOS X 上工作。
无法打开与您的身份验证代理的连接。
尝试运行:eval ssh-agent -s
@MonaJalal 使用 ssh-add ~/.ssh/github_rsa
实际上它对我来说效果很好,但是重新启动计算机后,我发现同样的问题又出现了,所以您是否希望我每次需要在服务器上部署我的项目时都这样做?!
k
kensai

您是否在 ~/.ssh 目录中创建了配置文件?它应该有如下内容:

Host github.com 
 IdentityFile ~/.ssh/github_rsa

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

并将其上传到 GitHub...

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


我已经生成了 ssh 密钥,并且能够很好地工作一段时间,没有任何问题。美好的一天(可能在重新启动后),它停止工作,而密钥在 github 和我的本地系统上完好无损。我添加了“配置文件”,指定了键映射到域。上面在 igor-ganapolsky-answer 中提供了详细信息。它工作正常!
这确实解决了我的问题!非常感谢!但我有一个问题。在使用您的方法之前,ssh -T git@github.com 正确回答,而 git push -u origin master 给出了与问题中相同的错误。为什么我可以正确连接到它但无法推送或从中获取?
@EdenHarder 我面临同样的问题。你找到答案了吗?
我在该主题上找到的每个教程和注释都假定 id_rsa 和 id_rsa.pub 就像它是第一个也是唯一一个 SSH 密钥。这次真是万分感谢。
它对我有用!我的系统上有 2 组密钥,这个解决方案解决了我的问题。不过最好解释一下here
c
cdhowie

您需要生成一个 SSH 密钥(如果您没有)并将公钥与您的 Github 帐户相关联。请参阅Github's own documentation


谢谢你...我现在从 GitHub 生成了一个 SSH 密钥。现在在终端中用什么命令将两者关联起来?谢谢!
没有终端命令。请参阅我在答案中链接的文档中的第 4 步。
我使用 HTTPS 克隆了存储库。在这种情况下我需要生成 SSH 密钥吗?
@PabitraDash 不。HTTPS 不使用 SSH 密钥。
救命稻草答案!
r
rmundo

这发生在我身上。由于某种原因,我的起源在我没有意识到的情况下搞砸了:

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

git remote -v

url 需要类似于 ssh://git@github.com/YourDirectory/YourProject.git;如果您没有看到 git@github.com,请使用

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

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


小心网址。它们在 https 和 ssh 之间有所不同,并且此页面上的帖子并没有说得那么清楚。每个 git 项目在项目根目录中都有一个 .git/config 文件。在那里您可以设置远程和分支信息。为 https 设置远程:url = github.com/<yourGitUserName>/<yourGitProject>.git 而对于 git+ssh:url = git@github.com:<yourGitUserName>/<yourGitProject>.git 有错误的 url 会导致公钥权限被拒绝错误,即可能不是一个非常明显的错误。
对于我在决赛中的情况,仅适用于以下部分: git remote set-url origin github.com/your_directory/your_project.git
g
george mano

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

git remote set-url origin https_link_to_repository

git push -u origin master

我得到“致命:没有这样的远程'起源'”
x
xinerd

假设您通过 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)->添加密钥

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

参考链接:Generating SSH keys


该解决方案适用于 ubuntu,$ssh-add /root/.ssh/id_rsa
这也解决了我的环境中的一个奇怪的问题,我建议的一个修改是避免 xclip 依赖,只需使用 cat ~/.ssh/id_rsa.pub
B
Badr Bellaj

另一个解决方案:

创建 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 密钥)下添加您的公钥。


d
d1jhoni1b

首先,我们需要检查您计算机上现有的 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 帐户或 repo 不知何故搞砸了,我不得不“链接”以前生成的公钥)


我是否必须从此命令将 SHA 输出复制到 github?
不,只需执行“ssh-keygen -lf ~/.ssh/
这就是为什么我还附加了一个命令“列出你的 .ssh 目录中的文件”......这样你就知道从哪个文件中提取你的密钥(ssh-keygen)。请记住 RSA 证书是密钥配对的,因此您将拥有一个私有证书和一个公共证书,您将无法访问私有证书,因为它属于 github(在这种情况下),但是当此错误发生时您可能会丢失公共证书(至少我的情况是这样,我的 github 帐户或 repo 不知何故搞砸了,我不得不再次“链接”以前生成的公钥)
$ ssh-keygen -lf ~/.ssh/github_rsa.pub /home/mona/.ssh/github_rsa.pub: 没有这样的文件或目录
“没有这样的文件或目录”意味着你没有那个文件名或路径......当执行 ls -al ~/.ssh 时你会得到什么?
m
marcdahan

这对我有用:

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

就是这样!


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

我收到了这个错误。原来我刚刚将 OSX 升级到 Sierra,我的旧密钥不再注册。

一开始我以为是"Upgrading to macOS Sierra will break your SSH keys and lock you out of your own servers"

但我回避了那个。原来我只需要重新注册我现有的密钥:

ssh-add -K

然后输入密码……完成!


同样的问题,对我有用:`ssh-add -K ~/.ssh/id_rsa`
r
roman

我想我有最好的答案给你,你的 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 运行克隆,所以它正在寻找错误的凭据。取下 sudo,我的克隆运行良好。
N
N. Osil

如果您没有访问自己的存储库,或者在克隆的存储库中进行克隆(使用一些“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。


R
Rose Perrone

确保 ssh-add -l 显示 SSH 密钥的指纹,该指纹出现在您的 Github 帐户的 SSH 密钥列表中。

如果输出为空,但您知道您有一个与您的 github 帐户一起使用的私有 SSH 密钥,请在此密钥上运行 ssh-add(在 ~/.ssh 中找到。它默认命名为 id_rsa,因此您可能会运行ssh-add id_rsa)。

否则,请按照 these instructions 生成 SSH 密钥对。


T
T J

我之前在我的一个 php 项目中使用了 github。在使用 github 时,我使用的是 ssh 而不是 https。我的 machine set up 就是这样,每次我提交和推送代码时,它都会询问我的 rsa 密钥密码。

几天后,我停止了 php 项目的工作并忘记了我的 rsa 密码。最近,我开始从事一个 java 项目并转移到 bitbucket。因为,我忘记了密码并且我猜是 no way to recover it,所以我决定为新项目使用 https(推荐)协议,并在问题中遇到了同样的错误。

我是怎么解决的?

运行这个命令告诉我的 git 使用 https 而不是 ssh: git config --global url."https://".insteadOf git:// 删除任何远程,如果有的话 git remote rm origin 重做从 git init 到 git push它有效!

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


我认为当 ssh 也应该工作时,将人们指向 https 不是一个好主意。此外,这不太可能适用于公司代理背后的人。
D
Damika

是的,我也有这个问题:/ 我打算以 HTTP 类型(不是 SSH 类型)将我的项目推送到 Github。我必须在每次推送中输入我的用户名和密码。所以首先我输入了与以下类型相关的代码

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

我得到了

git@github.com:权限被拒绝(公钥)。致命:无法从远程存储库中读取。

所以我通过以下方法解决了我的问题

git remote rm origin 删除您的 git 远程存储库 git remote now 检查您的远程远程存储库是否已被删除

URL = https://github.com/<用户名>/<存储库>.git

git remote add origin URL 再次添加您的 URL 以创建远程存储库 git push -u origin master 您可以将您的内容推送到远程存储库。在这里,当您使用“-u”命令创建一个跟踪分支并在远程存储库中跟踪分支的帮助下,您不会告诉 git 您在接下来的步骤中推送哪个分支:) 如果您使用这里linux git 在推送内容之前会询问用户名和密码。并提供您的相关凭据。

为了防止在每次推送中提供用户名和密码,您必须更改 git config

列出你的 git config - git config --global --list 你会看到

user.name=<your_username>
user.email=<your_email>

因此,您必须将 credential.helper 属性添加到您的 git 配置中

5.git config --global --add credential.helper store 将此添加到您的终端 现在您可以将新项目添加到您的文件中,然后 git add.git commit -m "<message>" git push
现在 git 也会请求您的用户名和密码,这将是上次。对于下一个 git pushes,git 不会向你请求用户名和密码 :)


超级感谢为我工作
x
xproph

好的,这个解决方案很少,其中一些可能已经被提及,但只是为了将它们放在一起:

确保您的密钥存在,默认情况下另一个 ~/.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 之前默默地发生了。谢谢。
A
Abhishek Tomar

解决这样的错误

git@github.com:权限被拒绝(公钥)。致命:无法从远程存储库中读取。请确保您拥有正确的访问权限

解决方案 (OSX)

打开您的终端并按照以下命令进行操作

$光盘~

$须藤苏

ssh-keygen 输入保存密钥的文件(/var/root/.ssh/id_rsa): $ id_rsa 输入密码(没有密码为空): $ hit enter 再次输入相同的密码: $ hit enter

输入保存密钥的文件 (/var/root/.ssh/id_rsa): $ id_rsa

Enter passphrase (empty for no passphrase): $ hit enter

再次输入相同的密码:$ 回车

cd ~/.ssh

$猫id_rsa.pub

复制显示内容。

打开 GitHub 单击您的个人资料图标设置>SSH 和 GPC 密钥

单击新的 ssh 密钥按钮

输入您复制的任何标题和密钥

现在检查您的问题已解决


它在推送到远程之前询问 sudo 密码。我们如何删除它?
@rohetoric - 不确定是否尝试在 GitHub 存储库中使用“允许写入访问”属性。
解决了我的访问被拒绝问题,并且可以在没有 sudo 的情况下使用 git。非常感谢!
p
prosti

允许对密钥(身份)进行写访问,然后单击添加密钥

https://i.stack.imgur.com/4LMTP.png

如果在 Windows 上,请在 Using Github via SSH 中查看更多详细信息。


这个截图是在哪里截的?
u
user7506706

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

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

输入您的系统密码,这应该可以工作。


i
imflash217

我想补充一些我的发现:

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

默认情况下,GitBash 搜索 ~/.ssh/id_rsa 作为 SSH 密钥的默认路径。

甚至文件名 id_rsa 也很重要。如果您将 SSH 密钥保存在其他文件名或路径中,则会引发Permission Denied(publickey)错误。


K
Kevin

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

编辑

如果您使用的是 git bash,请在 Windows 中添加到此使用 admin


这个。这也可能导致问题。
这是我的问题,但我不建议在文件夹上设置 777 权限。在我的情况下,该文件夹归 root 用户所有,我需要授予它访问我的非 root 用户帐户的权限。我这样做了:sudo chown -R $USER:$USER <your_folder_name_here>
@David,我也建议这样做。 777 非常hacky 且不安全。
H
Han Zhang

TLDR:

确保您具有对 repo 的写入权限(从 repo 的设置中配置它)。确保公钥在您的 github 帐户的 SSH 和 GPG 密钥中。

对我来说,当我尝试从新安装的机器克隆一些 repo 时,通常会发生此错误。 github 收到请求时,首先会检查公钥哈希。如果公钥不匹配任何用户,github 将拒绝此请求。如果机器是新机器并且您的 ssh 密钥是新生成的,这种情况很常见。


您能更具体地谈谈第 1 点吗?
如果 repo 属于您,您将始终可以写入 repo。如果 repo 不属于您,请让所有者将您添加到协作者中。
如果您尝试克隆公共存储库,则很有可能您的 SSH 密钥未添加到您的 github 帐户中。
我的问题是要问在 repo 的设置中究竟在哪里授予了写访问权限。
v
venkat razesh

您可以使用 Https url 登录

我猜您在说 git push 时尝试使用 ssh url 登录,如果它只询问密码,则认为您是通过 ssh 连接的。最好使用 http url。


N
Nabin

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

sudo git push origin master

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

git push origin master

没有使用 sudo。


J
Joomler

对我来说,我试过这个 -

eval "$(ssh-agent -s)"

然后我跑

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

并生成您可以运行的密钥

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

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

您可以将此密钥存储到 github 以获取更多信息,请阅读此 Adding a new SSH key to your GitHub account

我希望它会帮助别人:)


j
justin

我遇到了与@Batman 类似的问题。但是,因为我在 /usr/local/src/projectname 下运行它,所以不使用 sudo 运行不是一个选项。

只需添加 -E 标志来保存环境(您的 ~/.ssh/ 路径)。

$ sudo -E git clone git@your_repo

从人须藤:

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


T
Timur Shtatland

我在远程主机上使用 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_hostname 重新连接到远程主机,现在 git pull 可以工作了。配置中的更改可以将我的 ssh 密钥对从本地机器转发到任何主机。 ssh-A 选项实际上在该 ssh 会话中转发它。 See more details here.


c
coding360

https://i.stack.imgur.com/jLDVs.png

以管理员身份打开终端运行以下命令:“ssh-keygen”。它会生成一个 ssh 密钥,并将显示创建它的文件夹。检查我的图像复制生成的“ssh key”去你的github配置文件--->设置--->点击SSH和GPH--->点击“”New SSH Key Button”并粘贴“ssh key”最后“点击添加按钮”


太棒了,我试图找到很多解决方案,但这是直截了当的,一次就可以了。
j
juliarm

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