美文网首页程序员
通过普通SSH命令登录Vagrant虚拟机

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

作者: 无知者云 | 来源:发表于2018-03-08 15:15 被阅读0次

    本文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
    

    相关文章

      网友评论

        本文标题:通过普通SSH命令登录Vagrant虚拟机

        本文链接:https://www.haomeiwen.com/subject/dscyfftx.html