在服务器端

在服务器端

ssh客户端(默认情况下,至少在 Ubuntu 18.04 和 FreeBSD 12 中)始终检查服务器的密钥指纹是否在文件中known_hosts

我在局域网中有一台具有双启动功能的主机;两个操作系统都使用相同的静态 IP。我想连接ssh两个都其中,没有遇到错误。

这显然违反了对 执行的检查known_hosts:如果我接受一个指纹,它将与主机 IP 相关;当操作系统切换时,指纹发生变化,而IP是相同的,我需要手动删除它known_hosts才能再次连接。我想要那个指纹,或者另一个,在考虑该知识产权时被接受。

有没有客户端解决这个问题的方法是什么?

我正在使用OpenSSH_7.8p1, OpenSSL 1.1.1a-freebsd 20 Nov 2018OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n 7 Dec 2017

笔记:我不想“不检查”服务器的指纹。我只是想知道是否可以将两个替代指纹(不仅仅是一个)与服务器的 IP 地址相关联。

答案1

您的问题是主机密钥就是这样,它们是主机的密钥。每个主机实际上应该只有一个。当然有多种,因为密钥有多种类型,但我会避免依赖密钥类型来为单个主机提供多个可接受的密钥。

在服务器端

我的第一个建议是,如果您真的想在客户端执行此操作,请仔细考虑。您可以将这两个操作系统视为同一主机,只需将主机密钥从一个操作系统复制到另一个操作系统即可。

如果从 OpenSSH 复制,/etc/ssh/ssh_host*您可以在其他操作系统上使用它们。尽管它们可能需要一些重新格式化,具体取决于您运行的 SSH 服务器。


但 ...

请问为什么您排除了服务器端解决方案?最简单的方法不是尝试让两个操作系统使用相同的主机密钥吗? ——菲利普·库林

@PhilipCouling 部分是为了易于使用:操作系统之一是 Windows。部分原因是不要将密钥从主机转移到另一个主机,这种做法有时不被鼓励。但主要原因是:如果可能的话,我希望在 ssh 客户端配置中获得一定程度的灵活性。 – 弓公园

我认为您正在寻找一种将两个操作系统视为不同主机的方法,即使它们共享 IP 和端口号。


在客户端

也许最可靠的方法是为每个操作系统设置主机特定配置。编辑(或创建)~/.ssh/config以添加:

Host windows.dualbootbox
    Hostname 192.168.10.20
    UserKnownHostsFile ~/.ssh/windows.dualbootbox.known_hosts

Host ubuntu.dualbootbox
    Hostname 192.168.10.20
    UserKnownHostsFile ~/.ssh/ubuntu.dualbootbox.known_hosts

您无需指定Hostname每个地址是否Host已解析为 IP。看man ssh_config了解更多配置选项。

通过上述配置,您可以:

ssh [email protected]
ssh [email protected]

答案2

有很多方法可以做到这一点,一种方法是StrictHostKeyChecking no在对主机进行 ssh 时使用,它不会在known_hosts 中创建任何条目。

ssh -o StrictHostKeyChecking=no <ip>

或者

ssh -o UserKnownHostsFile=/dev/null <ip>

或者您可以根据需要更改 .ssh/config 文件。

相关内容