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版本来完全避免此问题:
如果您从Windows GitHub应用程序中克隆存储库,则这是远程URL所使用的。 也许他们知道我们不知道的事情。