通过普通SSH命令登录Vagrant虚拟机

本文github地址:

https://github.com/davenkin/vagrant-without-vagrant-ssh

创建一个单独的文件夹并切换进去:
mkdir my-test
cd my-test

初始化Vagrantfile:
vagrant init ubuntu/trusty64
ubuntu/trusty64是Ubuntu的一个发行版。

此时my-test文件夹下自动生成一个Vagrantfile文件,此时便可启动虚拟机:
vagrant up

然后SSH登录到该虚拟机:
vagrant ssh

在宿主机上运行:
ps aux | grep ssh
便可看到vagrant ssh实际所使用ssh命令,在笔者的电脑上显示如下:

ssh [email protected] -p 2200 -o Compression=yes -o DSAAuthentication=yes -o LogLevel=FATAL -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o IdentitiesOnly=yes -i /Users/yteng/my-test/.vagrant/machines/default/virtualbox/private_key

其中:
[email protected]表示通过本机(127.0.0.1)为跳板登录到虚拟机中,默认的用户名为vagrant

-p 2200表示使用本机的2200端口,该端口映射到了虚拟机的22端口。

-o StrictHostKeyChecking=no-o UserKnownHostsFile=/dev/null表示不做主机验证,即不用在第一次SSH的时候手动地回复一次yes。

-i /Users/yteng/my-test/.vagrant/machines/default/virtualbox/private_key表示使用Vagrant默认生成的密钥进行登录。

在虚拟机中查看ip地址:
ifconfig -a
结果显示如下:

enp0s3    Link encap:Ethernet  HWaddr 02:03:51:fc:44:0e
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::3:51ff:fefc:440e/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:99735 errors:0 dropped:0 overruns:0 frame:0
          TX packets:34433 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:94658619 (94.6 MB)  TX bytes:2236252 (2.2 MB)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:324 errors:0 dropped:0 overruns:0 frame:0
          TX packets:324 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1
          RX bytes:23944 (23.9 KB)  TX bytes:23944 (23.9 KB)

可以看出虚拟机IP地址为10.0.2.15,但是该IP地址是ping不通的:

ping 10.0.2.15
PING 10.0.2.15 (10.0.2.15): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
Request timeout for icmp_seq 4
Request timeout for icmp_seq 5
Request timeout for icmp_seq 6
Request timeout for icmp_seq 7

这是因为在默认情况下,Vagrant的虚拟机使用的NAT类型的网络,也即可以从虚拟机内部访问外部,但是从外部不能访问虚拟机。

为此,我们在Vagrantfile中将网络类型改为public_network:

config.vm.network "public_network"

启动虚拟机,vagrant ssh进入虚拟机,运行ifconfig -a查看网络情况:

eth0      Link encap:Ethernet  HWaddr 08:00:27:fb:fe:27
          inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fefb:fe27/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:405 errors:0 dropped:0 overruns:0 frame:0
          TX packets:297 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:45274 (45.2 KB)  TX bytes:39781 (39.7 KB)

eth1      Link encap:Ethernet  HWaddr 08:00:27:2c:3e:a8
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe2c:3ea8/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:19 errors:0 dropped:0 overruns:0 frame:0
          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2317 (2.3 KB)  TX bytes:942 (942.0 B)

可以看到原来的NAT网络(10.0.2.15)并没有别删除,但是多出来了一个新的网络,ip地址为192.168.0.100,该ip和宿主机的ip处于同一个IP网段里面,相当于宿主机的网络里又多了一台计算机,因此是可以从外部ping通的。

然后,我们结合先前查到的运行vagrant ssh时候的一些参数,尝试直接使用ssh直接登录虚拟机:

ssh [email protected]  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /Users/yteng/my-test/.vagrant/machines/default/virtualbox/private_key

登录成功!!!

可以看到,在vagrant ssh和直接ssh的时候,我们都使用了vagrant提供的不安全的密钥/Users/yteng/my-test/.vagrant/machines/default/virtualbox/private_key,为此,我们自己生成密钥对:

ssh-keygen

在选择密钥路径时,选择生成在当前目录:
Enter file in which to save the key (/Users/yteng/.ssh/id_rsa): my_id_rsa
此时直接输入:my_id_rsa

my-test下便生成好了新的密钥对:
Vagrantfile my_id_rsa my_id_rsa.pub

将公钥(my_id_rsa.pub)内容追加到虚拟机的/home/vagrant/.ssh/authorized_keys中,然后使用新的密钥进行登录:

ssh [email protected]  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i my_id_rsa

登录成功。

当然,我们也可以在Vagrantfile中,将公钥配置好,以后每次全新的启动虚拟机后,便可直接使用my_id_rsa密钥登录了。为此,编辑Vagrantfile:

 config.vm.provision "file", source: "my_id_rsa.pub", destination: "~/.ssh/my_id_rsa.pub"
 config.vm.provision "shell", inline: "cat ~/.ssh/my_id_rsa.pub >> ~/.ssh/authorized_keys", privileged: false

删除原来的虚拟机:

vagrant destroy

重新运行虚拟机:

vagrant up

此时就可以直接通过ssh命令登录了:

ssh [email protected]  -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i my_id_rsa

你可能感兴趣的:(通过普通SSH命令登录Vagrant虚拟机)