.ssh/id_rsa 失败:权限被拒绝。

36

我一直在搜索网络和stackoverflow,阅读了几篇关于权限被拒绝的求助帖子,但我找不到一个能以我能理解的方式解决我的问题。

我正在按照这些说明进行操作(在Heroku/Cedar上使用Python入门)。一切都很顺利,直到:

drewverlee@ubuntu:~/helloflask$ source venv/bin/activate
(venv)drewverlee@ubuntu:~/helloflask$ git push heroku master

The authenticity of host 'heroku.com (50.19.85.132)' can't be established.
RSA key fingerprint is ##:##:##:##:##:##:##:##:##:##:##:## (I replaced with #)
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/home/drewverlee/.ssh/known_hosts).
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

我认为可能是因为安全问题,所以我用“#”替换了密钥。

我认为这可能是因为

drwx------  2 root       root        1024 2012-03-08 21:26 .ssh

因为
drewverlee@ubuntu:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/drewverlee/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
open /home/drewverlee/.ssh/id_rsa failed: Permission denied.
Saving the key failed: /home/drewverlee/.ssh/id_rsa.

作为一个在这方面没有太多经验的人,我不确定如何安全地撤销我所做的事情,因为我知道我正在干涉强大的工具。请问这里有什么建议吗?如果需要更多信息来解决问题,请让我知道。

@CIRCLE,我认为这不是一个好主意。 - Phoenix87
5个回答

84

你应该拥有你自己目录下 .ssh 文件夹的权限,但在你的情况下,它被 root 用户所拥有。尝试执行以下命令:

cd ~
sudo chown drewverlee .ssh

然后重试创建密钥并连接。


我发现将整个用户目录作为自己的所有权可能是最有效的做法,感谢您指引我正确的方向。 - Drew Verlee
8
我发现ssh-keygen更喜欢创建.ssh目录。如果该目录已经存在,则无论权限配置多么宽松,它都会发出权限被拒绝的消息。 - ddoxey

10

由于某些原因,位于~/.ssh文件夹中的id_rsa文件对我的用户只有只读权限(0400)。我使用以下命令将其更改为读写权限(0600):

chmod 0600 id_rsa

在我明显地能够覆盖该文件之后,我想这些是您可以赋予该文件的最高权限,因为其他权限可能没有太多意义。


9

由于以上回答都不适用于我,我将发布我的答案:

如果您仍然记得密码并想保留旧的id_rsa,则使用推荐解决方案,否则请转到不推荐的解决方案

推荐解决方案

  1. 重置权限为正确值
chmod -c 0644 id_rsa.pub
chmod -c 0600 id_rsa

不推荐的解决方案

  1. 删除旧的ssh
sudo rm -rf ~/.ssh/id_rsa
sudo rm -rf ~/.ssh/id_rsa.pub
  1. 生成新的SSH并使用它(请参阅https://help.github.com/enterprise/2.15/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent/)。

为什么这样做可行:

  • 通过sudo命令创建的SSH是用于root用户的,而不是用于普通用户的。这意味着ssh-add ~/.ssh/id_rsa将无法将root SSH添加到用户中。
  • 当您尝试生成新的用户SSH时,由于旧的SSH是为root生成的,因此无法成功替换它。

(如果我的回答有误,请告诉我修正。谢谢:)


1
通过删除旧密钥,您将失去访问所有使用旧密钥的SSH服务器的权限,而不是仅更改权限和所有权以解决此问题! - Rehan Haider

3

我在CentOS 6上遇到了同样的问题。通过移除selinux解决了这个问题:

sudo yum remove selinux*

在这里找到答案。

注意:如果你不知道你正在做什么,盲目删除selinux可能不是一个好主意。


禁用SELinux比删除它更容易,只需将SELINUX=disabled更改为/etc/selinux/config中即可。请参阅CentOS文档 - Mark Fisher
停止禁用Selinux,如果真的是Selinux问题,您应该通过查看审计日志来修复上下文。 - Eric Rich

1
我的用户(ubuntu - 你可以通过输入whoami找到)确实拥有~/.ssh文件夹,但它仍然不允许我使用ssh-keygen中的符号链接(文件:~/.ssh/my_file_rsa)。所以我只是进入了~/.ssh文件夹,没有为rsa文件命名指定外部路径。
whoami
ls -Al ~

cd ~/.ssh
ssh-keygen
Enter file in which to save the key (/home/ubuntu/.ssh/id_rsa):  my_file_rsa

2
进入~/.ssh目录对我有用。我很想知道为什么这样会起作用。 - aalaap
@aalaap:奇怪的是这个方法对我也起作用了。我也想知道为什么。 - glades

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接