我连接了许多使用相同 IP 地址的设备。当我将它们插入路由器时,我收到警告消息,如果我仍想连接远程主机,则REMOTE HOST IDENTIFICATION HAS CHANGED!
需要运行。ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "xx.xx.xx.xx"
我目前的策略:
- 我想创建一个缩短的命令:
ssh-keygen -f "/home/xxx/.ssh/known_hosts" -R "xx.xx.xx.xx"
- 您可以从任何用户那里执行此操作。
- 它应该是一个单一命令。(如果我没有在 中设置它,我可以将一行复制粘贴到其他终端中
.bash_profile
。 - 需要
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
这样做了,以便它跳过真实性提示,但是如果您希望看到密钥指纹,则可以省略该选项。