Git提示“警告:已永久添加到已知主机列表中”

225
每当我使用git与远程交互,例如拉取或推送时,都会显示以下消息:

警告:已将“…”(RSA)永久添加到已知主机列表中。

如何防止这个烦人的消息显示?它只是一个麻烦 - 一切都正常运行。

1
你是真的想要每次都这样吗?它是否给出了形式为 The authenticity of host '...' can't be established. RSA key fingerprint is .... Are you sure you want to continue connecting (yes/no)? 的提示,或者你已经禁止了它?如果是这样的话,每次指纹都一样吗?如果不是,那就非常可怕了。更不可怕的选项是,某种方式它实际上没有成功写入主机文件,所以它每次都会尝试。看看 ~/.ssh/known_hosts - Cascabel
1
是的。每次都会弹出提示框,但我没有看到“你确定吗…”的消息 - 可能我已经将其禁止了。 - Donald T
主机是否在~/.ssh/known_hosts中列出?(它列出了5000次吗?)~/.ssh/config文件是否存在/包含任何内容(特别是StrictHostKeyChecking的值)? - Cascabel
主机在该文件中仅列出一次,并且它是唯一的条目。 - Donald T
2
我猜测你的known_hosts文件内容有问题。它应该是主机密钥,位于一行上。如果你只有主机名(例如),它将无法工作。我建议你删除这个文件(如果确实只包含此单个主机的信息),并允许SSH在下次连接时创建它。之后它应该是静默的。 - tripleee
显示剩余7条评论
16个回答

277

创建一个~/.ssh/config文件,并插入以下行:

UserKnownHostsFile ~/.ssh/known_hosts

下一次访问Github时,您会看到这条消息,但之后您将不再看到它,因为主机已添加到known_hosts文件中。这种方法修复了问题,而不仅仅是隐藏日志信息。

这个问题困扰我很长时间。该问题的原因是Windows编译的OpenSSH客户端没有检查~/.ssh/known_hosts中的known_hosts文件。

ssh -vvv git@github.com

debug3: check_host_in_hostfile: filename /dev/null
debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts
debug3: check_host_in_hostfile: filename /dev/null
debug3: check_host_in_hostfile: filename /etc/ssh/ssh_known_hosts
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.

11
是的,我不认为抑制警告或错误是解决问题的合适方法。 ;) - Jeremiah Gowdy
6
非常好用!最终那烦人的警告停止了。顺便说一下,在Windows系统中,~/.ssh/config中的~表示用户的主文件夹。为了轻松打开它,请按下 Win-R 键,输入 cmd 回车。命令提示符应该已经在您的主文件夹中打开了。键入 cd .ssh 回车,然后键入 start . 回车 以在Windows资源管理器中打开该文件夹。然后您可以在记事本中创建config文件(保存时不要添加 .txt 扩展名)。*(专业用户可以直接在命令提示符中运行echo到新文件 ;)).* 运行一个涉及remote的git命令两次(例如 git fetch),您就完成了。 - ADTC
3
为什么你的 SSH 有20个v? - bubakazouba
7
v字母越多,日志就会变得越冗长。请查看文档了解详细信息。使用三个v已经足够,使用二十个v就是过度杀伤了 :D - Petr Mánek
7
按住“v”键一秒钟比查看文档确定最大有用“v”的数量要快。 - Jeremiah Gowdy
显示剩余3条评论

97

在你的SSH配置文件 ($HOME/.ssh/config) 中添加以下行:

LogLevel=quiet

如果从命令行运行ssh,请在命令字符串中添加以下选项:

-o LogLevel=quiet
例如,以下代码将输出安装在machine.example.org上的gcc版本(且不产生警告):
ssh -o UserKnownHostsFile=/dev/null \
    -o StrictHostKeyChecking=no \
    -o LogLevel=quiet \
    -i identity_file \
    machine.example.org \
    gcc -dumpversion

1
将“LogLevel=quiet”添加到“config”文件中起作用了。谢谢。 - Donald T
3
为了保持安全,最好将"LogLevel=quiet"放在一个"Host"部分内。 - Joe
45
“LogLevel=quiet”不是一个好主意,他希望显示所有的错误信息,只是想要避免这个特定的讨厌错误。可能是因为他欺骗了ssh使用“/dev/null”作为“known_hosts”文件,可能是因为他想关闭“known_hosts”指纹检查,但由于ssh权威未允许他这样做,他无法实现。 - Elazar Leibovich
@bukzor 当连接被终止时,loglevel=error 仍会显示“连接到<服务器>已关闭”,这对于脚本编写也非常烦人。 - Guss
我给这个点了踩,因为它并没有真正解决问题,只是把它隐藏起来了。 - alaboudi

69

LogLevel设置为ERROR(而不是QUIET)在~/.ssh/config文件中,以避免看到这些错误:

Host *
   StrictHostKeyChecking no
   UserKnownHostsFile /dev/null
   LogLevel ERROR

2
这在我的情况下效果最好 - 或者你可以在命令行上指定“-oLogLevel = ERROR”。 - Brad
我仅针对本地IP和主机使用这些设置,这些主机大多是虚拟机,在这些主机上,主机密钥相对频繁地更改:Host 192.* 10.* *.mylocal.domain - TNT
超级聪明 =)) 这个完美而简单的工作方式是:LogLevel ERROR - ThangTD

8

这条消息来自SSH,它正在警告您连接到一个之前从未连接过的主机。我不建议关闭它,因为这可能意味着你会错过有关主机密钥更改的警告,这可能表明您的SSH会话受到了中间人攻击。


2
但是我每天连接10-15次,仍然收到这个警告。 - Donald T
@JackB。查看~/.ssh/known_hosts文件,看看你的主机是否在其中。 - Borealid
密钥是否因某些原因而更改?请检查文件中的指纹与ssh输出的指纹是否相同。此外,您的.ssh目录模式是否设置为0700? - Jason Carreiro
3
@JasonCarreiro,我是个大男孩,我知道没有人会在我的机架内进行中间人攻击,安全性是一个权衡,我希望新的电脑能够使用预共享密钥直接开箱即用,无需管理 CA 或 ssh-keyscan - Elazar Leibovich

5

为了抑制ssh的警告信息,您可以在~/.ssh/config中添加以下行:

Host *
LogLevel error

这将禁用警告,但不会禁用错误消息。与~/.ssh/config中的其他设置一样,如果您想要更细粒度的控制,可以按主机配置LogLevel


4
这主要意味着该主机的密钥有更改,位于~/.ssh/known_hosts文件中,并且不会自动更新。因此,每次你都会收到警告消息。

通常在连接到重新创建的虚拟机时会发生此情况,这会更改具有相同IP地址的密钥。

解决方案

如果只有一个条目,则可以删除 ~/.ssh/known_hosts 文件,然后在第一次连接后,该密钥将生成,并且之后不会再出现警告消息。

如果有多个条目,则可以使用以下命令来删除:

$ ssh-keygen -R <hostname>

对我来说它很正常工作


2
添加ssh密钥
ssh-keygen -t rsa -b 4096 -C "abc@abc.com"

eval "$(ssh-agent -s)"

ssh-add ~/.ssh/bitbucket_rsa

创建配置文件。
crate ~/.ssh/config

添加下面一行。
UserKnownHostsFile ~/.ssh/known_hosts

然后添加公钥并克隆您的存储库... 完成.....

1
将您的私钥添加到ssh-agent中:
ssh-add ~/.ssh/id_rsa

0

你只需要这个命令。

如果是的话,使用GitHub:

ssh -T git@gitlab.com

如果您使用GitLab:
ssh -T git@gitlab.com

0

我曾在Linux/CentOS虚拟机中遇到过同样的错误,这是因为IP在重启后会发生改变。为了解决这个问题,我在网络中定义了一个静态IP,并将该条目添加到/etc/hosts文件中。对于静态IP,请提供略高的范围值。例如,如果您当前的IP(ipconfig/ifconfig)是192.168.0.102,在下一次重新启动后,可能会变成192.168.0.103。因此,在IPV4设置中定义您的静态IP为192.168.0.181即可解决问题。


尝试突出关键词并清晰格式化,这将有助于为其他人提供答案。 - Agilanbu

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