我在全新安装的 Ubuntu 16.04 上使用 OpenSSH 7.6p1 时遇到了问题(这个问题在我之前的 Ubuntu 上不存在,我从中复制了配置文件。不幸的是,那个操作系统已经被毁了)
我正在尝试关闭对特定域集的严格主机密钥检查(在下面的示例中,任何匹配的内容*.mydomain.com
)。/etc/ssh/ssh_config
已完全注释掉。我有一个配置文件,~/.ssh/config
其内容等同于以下内容:
Host *.mydomain.com
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
Host foo
HostName myserver.mydomain.com
PasswordAuthentication yes
User myuser
现在,当我执行时ssh foo
,我希望它将别名为[email protected]
,意识到它不应该执行StrictHostKeyChecking,要求我输入密码并且(当输入正确的密码时)将新的主机密钥条目写入/dev/null
(当然,这本质上是一个 NOP)。
但是,当我ssh foo
在系统上执行时,它会使用别名并尝试使用正确的用户连接到正确的服务器(这意味着它正在读取我的配置文件,否则它不知道“foo”是什么),但会给我一个主机密钥验证错误(否则它是正确的,因为主机密钥在 known_hosts 中是错误的)。如果我从 known_hosts 中删除有问题的密钥并重试,它会将新的主机密钥写入 known_hosts 而不是 /dev/null。本质上,这就像我的配置文件中的第一个节被忽略了。
这是我的配置问题吗?还是这是一个已知问题?任何帮助都将不胜感激。
答案1
SSH 仅搜索配置文件一次以查找选项。因此,它会使用主机名参数foo
查找所有匹配的部分,然后将它们合并在一起。
它不会再通过配置再次寻找基于将要连接的最终主机名/地址的新配置。
因此,“问题”只是您期望 ssh 的工作方式与实际工作方式不同。对此深表歉意。有时我也希望它能按照您希望的方式工作。
我所能建议的就是安装大多数 shell 都提供的自动完成功能。这样,您就不必为 指定别名,只需为指定foo
别名,它就会自动完成为。foo.mydomain.com
foo<tab>
myserver.mydomain.com