无法将主机添加到已知主机列表中。

97

Mac OSX Lion 10.7.

为了解决一些奇怪的环境问题(homebrew无法安装wget,我遇到了各种奇怪的阻塞和错误),我卸载了zschrc、homebrew和其他一些东西,然后安装了fish shell。

现在,每当我尝试从github中push/pull数据时,都会出现以下错误:

The authenticity of host 'github.com (204.232.175.90)' can't be established.
RSA key fingerprint is <string of colon-separated chars that I should probs keep private>.
Are you sure you want to continue connecting (yes/no)? yes
Failed to add the host to the list of known hosts (/Users/sasha/.ssh/known_hosts).

所以我尝试检查我的~ / .ssh文件夹的权限,并得到了这个结果,看起来对我来说很好:

-rw-r--r--  1 sasha  staff    97B Jul  9 22:56 config
-rw-------  1 sasha  staff   1.7K May 16  2012 id_rsa
-rw-r--r--  1 sasha  staff   403B May 16  2012 id_rsa.pub
drwx------  5 sasha  staff   170B Jul 15 09:56 known_hosts

known_hosts文件中只有一个.pem文件,我用它来进行ssh连接(也出现了“authenticity…”提示),连接的是Amazon ec2实例,尽管在情况危急时我曾尝试将id_rsa和id_rsa.pub复制到其中。

你有什么想法吗?我很想解决这个问题,这样每次推送/拉取时就不需要频繁地提示我。

编辑 我之前成功地按照这些说明操作过,所以我的ssh密钥已经存在于Github上,并且被识别,因此当我运行ssh -T git@github.com时,会得到以下结果:

Hi sashafklein! You've successfully authenticated, but GitHub does not provide shell access.

看起来只有我的本地计算机对我的ssh情况不满意。


如果有人在这里是因为他们正在尝试连接DigitalOcean的doctl工具,请先使用ssh直接连接IP。 - Jxek
21个回答

178

针对您的情况,您的known_hosts是一个文件夹,因此您需要先删除它。

对于其他遇到类似问题的人,请检查您的~/ssh/known_hosts的正确权限,因为它可能归不同的用户(例如root)所有。所以您可以尝试运行:

sudo chown -v $USER ~/.ssh/known_hosts

修复它。


4
仍然出现错误:无法将主机添加到已知主机列表中(/Users/igorganapolsky/.ssh/known_hosts)。 - IgorGanapolsky
应该将组也更改为$USER还是保留“-rw-r--r-- 1 $USER root”? - Suncatcher
1
@Suncatcher更安全的方法是离开root组。通常来说,root组的用户都拥有sudo访问权限。另外,known_hosts文件中的数据并不是很机密。 - kenorb
3
请注意,主目录和.ssh目录也必须具有正确的权限(仅用户可读、写、执行)。 - tjb
1
另外,请确保您在本地计算机上执行此操作,而不是连接到的远程计算机上执行。 - G_Style
显示剩余4条评论

83

这是我所需要的解决方案。

sudo chmod 700 ~/.ssh/
sudo chmod 600 ~/.ssh/*
sudo chown -R ${USER} ~/.ssh/
sudo chgrp -R ${USER} ~/.ssh/

更改组真的必要吗? - Dmitri Zaitsev
1
@DmitriZaitsev 尝试一下不加,看看是否可行,否则就需要加上。 - Stoney Eagle
7
我刚刚尝试了前两个命令,它们起作用了。谢谢你。 - duyetpt
这对我有用!我为这个奇怪的错误苦苦挣扎了2个小时:update_known_hosts: hostfile_replace_entries无法为/home/USER/.ssh/known_hosts执行,权限被拒绝。 - Jorma Rebane

35
对于在Ubuntu上的用户,如果您遇到以下错误:

无法将主机添加到已知主机列表中

那么只需删除known_hosts文件,并重新运行您的ssh。这将使用适当的权限重新生成known_host文件,并将您尝试ssh进入的远程主机添加到此文件中。

2
如何重新运行我的SSH? - Maviles
1
@Maviles 只需再次连接到 SSH 服务器,SSL 客户端将重新创建该“known_hosts”文件。 - hldev

27

我认为删除~/.ssh/known_hosts文件夹(而不是文件)已经解决了OP的问题。但对于其他可能遇到此问题的人,我注意到我的一个服务器权限很奇怪(400):

-r--------. 1 user user 396 Jan 7 11:12 /home/user/.ssh/known_hosts

所以我通过添加所有者/用户PLUS写入解决了这个问题。

chmod u+w ~/.ssh/known_hosts

因此,~/.ssh/known_hosts需要是一个平面文件,必须归您所有,并且您需要能够读取和写入它。

您可以随时声明known_hosts破产,将其删除,然后像往常一样继续操作,连接到东西(git / ssh)将重新生成一个新的known_hosts文件,应该可以正常工作。


2
在我的系统中(恢复后),该文件的所有者是root... chown user.user ~/.ssh/known_hosts 解决了这个问题。 - Paolo
1
有趣。我怎么会遇到这样一个非常愚蠢的问题。chmod u+w 解决了这个问题。一定是某个有问题的安全脚本…… - gluk47

24

已知的主机应该是一个平面文件,而不是一个目录?

如果这不是问题所在,那么Github上的此页面可能会有所帮助。尝试使用SSH和-v或-vv标志查看详细错误消息。这可能会使您更好地了解故障原因。


1
奇怪。我想我一定把它变成了一个目录,尽管我不记得是什么时候。移动/重命名它解决了所有问题。谢谢! - Sasha
WSL 上遇到了同样的问题,删除文件后问题得到解决。运行该命令会创建一个新文件。谢谢。 - csalmeida
我创建了目录 known_hosts.d 并且工作得非常完美。 - Cassol

10

这个命令适用于我:

sudo chown -v $USER ~/.ssh/known_hosts

正如@kenorb所提到的。

错误是由于当前用户权限不正确导致的。


7

好的,理想的权限应该如下所示:
对于ssh目录(您可以通过键入ls -ld ~/.ssh/来获取此目录),
drwx------ 2 oroborus oroborus 4096 Nov 28 12:05 /home/oroborus/.ssh/

d表示目录,rwx表示用户oroborus具有读取、写入和执行权限。这里的oroborus是我的计算机名称,您可以通过回显$USER找到自己的计算机名称。第二个oroborus实际上是组名。您可以在这里了解更多关于每个字段的含义。学习这一点非常重要,因为如果您正在使用ubuntu/osx或任何Linux发行版,很可能会再次遇到它。

现在,要使您的权限看起来像这样,您需要键入
sudo chmod 700 ~/.ssh

7的二进制是111,这意味着读1、写1和执行1,您可以通过类似的逻辑解码6,这意味着只有读写权限。

您已经给了您的用户读取、写入和执行权限。确保您的文件权限看起来像这样。

total 20
-rw------- 1 oroborus oroborus  418 Nov  8  2014 authorized_keys
-rw------- 1 oroborus oroborus   34 Oct 19 14:25 config
-rw------- 1 oroborus oroborus 1679 Nov 15  2015 id_rsa
-rw------- 1 oroborus oroborus  418 Nov 15  2015 id_rsa.pub
-rw-r--r-- 1 oroborus root      222 Nov 28 12:12 known_hosts

您已经为所有文件赋予了您的用户读写权限。

您可以通过键入ls -l ~/.ssh/来查看此内容。

这个问题是由于ssh程序试图在其文件夹中写入一个名为known_hosts的文件所致。如果它在写入时发现没有足够的权限,它将不会在该文件中写入,因此失败。这是我对该问题的理解,更有知识的人可以提供更多信息。希望能有所帮助。


4

对我来说,我只是这样做:

rm -rf ~/.ssh/known_hosts

那么:

我只需通过ssh登录目标主机,一切就会没问题。这仅适用于您不知道“known_hosts”文件的权限和默认所有者的情况。


3

#检查目录和文件的权限。

ls -la ~/.ssh/

#在我的情况下,~/.ssh/known_hosts是由root拥有的。

sudo chown xxx:xxx ~/.ssh/known_hosts

#其中xxx = 我的用户名

#然后ssh到某个服务器,警告消息仍然会出现,直到你成功ssh一次以进行验证,退出并再次ssh以进行验证。


3

以防其他人遇到同样错误信息,并且 .ssh 和 .ssh/known_hosts 权限看起来都没问题。

我的问题是我通过 snap 安装了 gh,而 snap 应用对文件系统的访问权限受限,显然无法访问 .ssh。解决方案是删除 snap 安装并从 apt 安装。


1
这个问题仍然存在 :< - Radost

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