Git说:“警告:永久添加到已知主机的列表”

每次我使用git与远程进行交互时(例如拉或推)时,都会显示以下消息:

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

我怎样才能防止这个恼人的消息显示? 这只是一个烦恼 – 一切正常。

这个问题困扰了我很长一段时间。 问题是,他们为Windows编译的OpenSSH客户端不检查~/.ssh/known_hosts的known_hosts文件

ssh -vvvvvvvvvvvvvvvvvvv 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. 

答案是创build一个~/.ssh/config文件并插入这行:

 UserKnownHostsFile ~/.ssh/known_hosts 

接下来当你访问Github的时候你会看到这个消息,但是之后你就不会再看到这个消息了,因为主机被添加到了known_hosts文件中。 这实际上解决了这个问题,而不是仅仅隐藏日志消息。

将以下行添加到您的sshconfiguration文件($ HOME / .ssh / config)中:

 LogLevel=quiet 

如果从命令行运行ssh,请将以下选项添加到命令string中:

 -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 

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

 Host * StrictHostKeyChecking no UserKnownHostsFile /dev/null LogLevel ERROR 

这条消息来自SSH,这是警告你,你连接到一个你从来没有连接过的主机。 我不build议将其closures,因为这意味着您可能会错过关于主机密钥更改的警告,这可能表示您的SSH会话中出现MITM攻击。

要禁止ssh警告消息,可以~/.ssh/config添加到~/.ssh/config

 Host * LogLevel error 

这将禁用警告,但不是错误消息。 像~/.ssh/config的其他设置一样,如果您想要更精细的控制,则可以在每台主机上configurationLogLevel

它主要意味着该主机的密钥有所更改~/.ssh/known_hosts ,并且不会自动更新它。 所以每次你得到这个警告信息。

这通常发生在连接到重新创build的虚拟机上,这会改变具有相同IP地址的密钥

如果只有一个条目,那么可以删除~/.ssh/known_hosts文件,并且在第一次连接之后,该键将会在那里,并且之后不会有警告消息。

如果你有多个条目,那么你可以使用下面的命令来删除

 $ ssh-keygen -R <hostname> 

这对我来说可以

就我所知,对于您提到的问题,没有一个清晰的解决办法。
先前build议的/ dev / nullredirect仍然会显示警告,它只是通过将输出redirect到/ dev / null来禁用存储远程密钥的安全function。
所以ssh仍然会认为它写了一些实际上被丢弃的东西。

据我所知,唯一的select是捕获消息,并从标准输出中删除它。

 ssh/scp..... 2>&1 | grep -v "^Warning: Permanently added" 

下面是一个完整的例子,你可以用它作为包装来隐藏这样的警告:

 #!/bin/bash remove="^Warning: Permanently added" # message to remove from output cmd=${0##*/} case $cmd in ssh) binary=/usr/bin/ssh ;; *) echo "unsupported binary ($0)" exit ;; esac $binary "$@" 2>&1 | grep -v "$remove" 

要安装它,所有你需要做的就是添加/修改你想要修改的实际命令的“case”语句。 (ssh,scp,git等)。
“ssh”表示脚本必须被命名为“ssh”(或脚本的链接名为ssh)。 binary = / full / path是脚本应该包装的二进制文件的path。
然后把你的select名称脚本放入/ bin或其他地方。

这个脚本也是你可以在$ binaryvariables中使用-o“UserKnownHostsFile = / dev / null”的地方,这比把全局的sshconfiguration放到全局的sshconfiguration中会好很多,这会影响你所有的ssh会话只是那些你想压制的信息。

缺点:
这是一个开销,而不是一个完全干净的解决scheme,并将标准inputstdout可能不是在所有情况下都好。
但它会摆脱任何你不希望看到的警告信息,你可以使用一个脚本来包装你想要的所有二进制文件(通过使用文件系统链接)

我有同样的问题,我发现我的~没有一个.ssh文件。 所以我只是在.ssh下创build.ssh目录,解决了这个问题。

如果您使用GitHub中的存储库,请考虑使用URL的HTTPS版本来完全避免此问题:

点击HTTP按钮,然后克隆该网址

如果您从Windows GitHub应用程序中克隆存储库,则这是远程URL所使用的。 也许他们知道我们不知道的事情。