不要为SSH添加hostkey到known_hosts


111

我想通过SSH连接到主机,但不希望将主机名添加到我的~/.ssh/known_hosts

我怎样才能做到这一点?

Answers:


99
-o "UserKnownHostsFile /dev/null"

应该管用。


3
按预期工作,但是它将始终报告:“警告:将'hostname,ip'(RSA)永久添加到已知主机列表中。” 我用2>&1 | grep -v "^Warning: Permanently added"
Guillaume Boudreau

3
添加-o“ LogLevel ERROR”,它将不再发出警告警告
John

1
注意:禁止显示该消息的请求“警告:将'hostname,ip'(RSA)永久添加到已知主机列表中。“ 被报告给维护者bugzilla.mindrot.org/show_bug.cgi?id=2413
Ben Creasy

2
用管道grep将标准输出和标准错误合并;退出状态也会改变。如果使用bash,则最好使用进程替换来消除消息:ssh 2> >( egrep >&2 -v '^Warning: Permanently added') -o "UserKnownHostsFile /dev/null" [...]。这样可以避免管道,从而避免出口状态处理中的相应变化。
亚历克斯·O

1
@John最好在这些注释中使用其他方法之一,否则您将引入安全漏洞,因为它可能隐藏其他不相关的警告
Jon Bentley

97

如果由于使用云服务器(AWS EC2,Rackspace CloudServers等)而需要这种行为,或者在Vagrant中不断配置新映像,则可能需要更新SSH配置,而不是在服务器上添加bash别名或更多选项。命令行。

考虑添加以下内容:

Host *.mydomain.com 
  StrictHostKeyChecking no
  UserKnownHostsFile /dev/null
  User foo
  LogLevel QUIET
  • 对主机使用尽可能严格的正则表达式以确保安全。
  • 将LogLevel设置为QUIET可以避免出现纪尧姆提到的警告

您确实应该尝试不完全禁用StrictHostKeyChecking,因此cclark的答案对于使用云服务器是一个很大的折衷。
Alex Recarey 2012年

当我对Vagrant使用Shipit(JavaScript部署工具)时,这对我非常有用。我无法轻易获得Shipit传递给SSH的参数,因此这使我可以回避该工具,并告诉它我做了什么并且不想记住它。
约翰·蒙施

1
LogLevel是我一直在寻找的东西。它还有一个优点,就是在运行脚本时不显示公司配置的通知!(我现在正在运行,且日志级别为ERROR)
Anshu Prateek

我要在哪个文件中添加?
Wim Deblauwe

这是您的SSH配置文件。在Linux或macOS中,文件通常位于主目录中名为.ssh的目录中,名为config-〜/ .ssh / config
cclark

8

我觉得要将主机密钥添加到您的known_hosts(根据我的经验,运行这些服务的人员至少足够聪明,可以使服务于相同主机名的计算机之间的主机密钥保持一致),然后打开StrictHostKeyChecking,关闭CheckHostIP和使用LogLevel ERROR进行日志记录将在不牺牲安全性的情况下为您提供最佳体验。(好吧,没有CheckHostIP,您确实需要信任DNS,如果没有广泛的DNSSEC或类似的东西,这是一个巨大的漏洞;但是我们暂时将其扫一扫。)

我使用一个只读的known_hosts文件,所以我必须做一些事情,否则会收到无数警告,提示无法将条目添加到known_hosts。

我用什么:

Host github.com *.github.com
StrictHostKeyChecking yes
CheckHostIP no
LogLevel ERROR

我希望这些服务通过HTTPS在其网站上发布其SSH主机密钥,因此我可以显式复制它们,而不必先进行连接就可能使自己遭受MITM攻击。


7

对于单个ssh会话,请使用此

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null user@host

4
对于已有5年历史的问题,这不会为接受的答案增加任何新内容。
JakeGould 2015年

5

我建议

LogLevel ERROR

过度

LogLevel QUIET

因此您仍然会收到“无法解析主机名”和其他此类错误


您应该能够信任您的SSH连接,恕我直言。不仅让您对风险保持沉默。
sylvainulg 2015年

3
真的取决于。我们的开发环境每周都会拆除并重建,它们的A记录保持不变,但是每次构建时都会生成其主机密钥。我们不能保留主机密钥,因为A记录只是基于环境名称在数据库中定义的,并且可以随时删除环境名称或创建新的环境名称,因此上述解决方法确实有用。
Alex Berry

2

您是否尝试过禁用StrictHostKeyChecking?您可以使用-o选项或在配置文件中进行操作~/.ssh/config


我已经在用了。但是它具有不同的效果:降低了主机密钥检查的严格性。即,当主机未知时,当您禁用该选项时,它仍会连接。因此,它仍然可以保存主机。但是我想我已经找到了正确的解决方案(请参阅我的答案)。
艾伯特2010年

0

我发现以下.ssh / config条目很有用(带有DHCP和DNS的LAN):

 CheckHostIP no

 Host *.*
 CheckHostIP yes

结果是本地计算机名称“ zora”或“ goron”将不会检查动态分配的IP地址,但www.mycompany.com或node42.planetlab.com仍将确认其静态IP。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.