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 2018
和OpenSSH_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 文件。