本文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 vagrant@127.0.0.1 -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
其中:
vagrant@127.0.0.1
表示通过本机(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 vagrant@192.168.0.100 -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 vagrant@192.168.0.100 -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 vagrant@192.168.0.100 -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i my_id_rsa
网友评论