如何在ssh/config中管理多个仅端口不同的localhost条目并解决主机密钥冲突问题
如何在ssh/config中管理多个仅端口不同的localhost条目并解决主机密钥冲突问题
看起来你遇到的问题核心在于:所有自定义的SSH Host(比如prod、dev、thetaone)都把HostName设成了localhost,这会让SSH把它们全部关联到known_hosts文件里同一个localhost条目上,但实际上每个Host对应的是不同的远程EC2实例,它们的主机密钥自然不一样,所以就触发了那个恼人的"远程主机标识已更改"警告。
最优雅的解决方案是使用HostKeyAlias指令,给每个Host指定一个唯一的别名,让SSH把它们的密钥分别存在known_hosts里,而不是都归到localhost下面。修改后的配置如下:
Host * AddKeysToAgent yes IdentityFile ~/.ssh/id_ed25519 Host thetaone HostName localhost User ssm-user LocalForward 11000 localhost:22 LocalForward 5800 localhost:5800 ProxyCommand aws ssm start-session --profile thetaone --target i-xxxxxx --document-name AWS-StartSSHSession HostKeyAlias thetaone.local # 为该Host指定唯一的密钥别名 Host prod HostName localhost User myuser LocalForward 12000 localhost:22 ProxyCommand aws ssm start-session --target i-yyyyy --profile prod --document-name AWS-StartSSHSession HostKeyAlias prod.local # 为该Host指定唯一的密钥别名 Host dev HostName localhost User myuser LocalForward 10000 localhost:22 ProxyCommand aws ssm start-session --target i-zzzz --profile dev --document-name AWS-StartSSHSession HostKeyAlias dev.local # 为该Host指定唯一的密钥别名 Host sb HostName foo.bar.org User someuser ProxyJump thetaone
原理说明
HostKeyAlias指令会告诉SSH:不要把当前Host的密钥和localhost绑定,而是和你指定的别名绑定。这样每个Host的密钥都会在known_hosts里单独存储,不会互相覆盖或冲突。
后续操作
如果你之前已经在known_hosts里有了localhost的错误条目,可以先删掉对应的行(比如你提到的第19行),然后重新连接每个Host,SSH会自动把对应的别名和密钥存进去,之后再连接就不会有警告了。
这样配置之后,你再分别执行ssh prod、ssh dev、ssh thetaone的时候,每个连接都会使用独立的主机密钥记录,完全无缝解决冲突问题。
备注:内容来源于stack exchange,提问作者Christian Bongiorno




