绕过“远程主机标识已更改”警告

绕过“远程主机标识已更改”警告

我连接了许多使用相同 IP 地址的设备。当我将它们插入路由器时,我收到警告消息,如果我仍想连接远程主机,则REMOTE HOST IDENTIFICATION HAS CHANGED!需要运行。ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "xx.xx.xx.xx"

我目前的策略:

  1. 我想创建一个缩短的命令:ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "xx.xx.xx.xx"
  2. 您可以从任何用户那里执行此操作。
  3. 它应该是一个单一命令。(如果我没有在 中设置它,我可以将一行复制粘贴到其他终端中.bash_profile
  4. 需要xx.xx.xx.xx可配置。

由于您无法为别名提供参数(至少我是这样认为的)我尝试用以下方法解决它read

$ alias ssh-keyrm='read LAST_SSH_IP_ADDRESS_CLEARED && ssh-keygen -f "$HOME/.ssh/known_hosts" -R "$LAST_SSH_IP_ADDRESS_CLEARED"'
$ ssh-keyrm
xx.xx.xx.xx

关于如何进一步优化它,有什么建议吗?

答案1

另一种解决方案是从一开始就防止主机密钥被保存

请注意,这将禁用使 ssh 安全的部分功能,即验证您正在连接的主机实际上就是您认为的主机!

添加部分~/.ssh/config

host 192.168.*.*
    StrictHostkeyChecking no
    UserKnownHostsFile /dev/null

答案2

如果您想将参数传递给 Bash 中预定义的某个内容,则可以使用函数而不是别名来达到相同的效果:

ssh-keyrm() { ssh-keygen -f "$HOME/.ssh/known_hosts" -R "$1"; }

运行如下:

$ ssh-keyrm 127.0.0.1

与别名一样,函数可以存储在 .bashrc、.bash_profile 中,或者在 shell 中定义。

答案3

您不能为别名提供参数

Bash 别名作为简单扩展工作(别名名称仅被别名值替换),因此它们不能引用个人使用 $n 的参数。

但是,你可以提供论据,只要它们在最后命令。使用如下别名:

alias rmh="ssh-keygen -f ~/.ssh/known_hosts -R"

您可以这样运行它rmh 192.168.0.1,尽管单词rmh将被扩展,但其后面的所有参数仍将保留在相同的位置。

答案4

我在不同设备上使用相同的 IP 时也遇到了类似的问题,但是我采用了略有不同的方法来解决:known_hosts首先阻止主机密钥进入

alias sshn='ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

sshn然后在您想要禁用主机密钥安全时运行。

$ sshn [email protected]
Warning: Permanently added '192.168.1.1' (ECDSA) to the list of known hosts.

[email protected]'s password:

ssh 告诉您它已将主机添加到已知主机,但实际上并没有,因为写入已转到/dev/null。您可以通过调整日志记录级别来抑制这种情况,但这可能会关闭其他有用的消息。

我也StrictHostKeyChecking=no这样做了,以便它跳过真实性提示,但是如果您希望看到密钥指纹,则可以省略该选项。

相关内容