我在 VirtualBox 上安装了一个 Ubuntu 服务器映像。接下来我配置了端口转发 2222=>22。
当我使用以下命令时,一切正常:
ssh -p 2222 [email protected]
系统提示输入密码,然后我就可以登录 VBox 上的 Ubuntu。
但是当我使用时:
ssh -p 2222 java@localhost
我得到以下
@@ ... /Users/cristian/.ssh/known_hosts:2 中存在问题的 RSA 密钥 [localhost]:2222 的 RSA 主机密钥已更改,并且您已请求严格检查。主机密钥验证失败。
当然
ping 本地主机 PING 本地主机(127.0.0.1):来自 127.0.0.1 的 56 个数据字节 64 个字节:icmp_seq=0 ttl=64 时间=0.038 毫秒
知道为什么吗?
谢谢
答案1
对于经常重新安装的本地主机,我的解决方法是配置 ssh,以便本地 IP 使用 /dev/null 作为主机文件(危险,请小心)。
答案2
重述一下问题(以澄清评论中的一些问题):原始问题指出使用了 NAT,因此运行 VM 的主机和 VM 本身都由 127.0.0.1 又称 localhost 标识。因此,从主机,可以通过将主机端口 2222 映射到 VM 端口 22,使用端口转发(如上所述)登录 VM。如果我们启动了多个 VM,并且所有 VM 都具有类似的网络配置,那么在 ssh 客户端看来,目标确实在变化(因为确实在变化)。
因此,回到最初的问题,解决手头的问题:与其配置ssh
为/dev/null
使用 hosts 文件(可以按主机进行配置~/.ssh/config
,特别是对于 localhost),不如简单地在文件中为虚拟机指定一个唯一的名称/etc/hosts
,然后使用主机名而不是 127.0.0.1 或 localhost 来引用它们。因此,每个虚拟机在主机的已知主机文件中都有自己的名称。例如,
$ sudo vim /etc/hosts
...
127.0.0.1 localhost my_real_hostname
127.0.0.1 my_vm1
127.0.0.1 my_vm2
...
可以根据需要添加新的 VM(要么在一行上添加所有的 VM,要么在单独的行上添加,这可能会使编写添加/删除脚本变得更容易一些sed
(留给读者的练习))。
然后登录到虚拟机,使用新的主机名,它实际上只是映射到 127.0.0.1(再次假设在虚拟机的 VirtualBox 高级网络设置中配置了端口转发),
$ ssh -p 2222 vm_user@my_vm2
The authenticity of host '[my_vm2]:2222 ([127.0.0.1]:2222)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[my_vm2]:2222' to the list of known hosts.
要去除它,
$ ssh-keygen -R '[my_vm2]:2222'
# Host [my_vm2]:2222 found: line 16
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old
请注意,可以对导致原始问题的本地主机执行相同的操作(重复),
$ ssh-keygen -R '[localhost]:2222'
# Host [localhost]:2222 found: line 16
/home/user/.ssh/known_hosts updated.
Original contents retained as /home/user/.ssh/known_hosts.old