You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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 prodssh devssh thetaone的时候,每个连接都会使用独立的主机密钥记录,完全无缝解决冲突问题。

备注:内容来源于stack exchange,提问作者Christian Bongiorno

火山引擎 最新活动