有这么一种需求,我在 VirtualBox 中安装了一个 Ubuntu Server 虚拟机, 然后我希望在主机上可以使用 SSH 来通过命令行操作虚拟机,而不需要来回手动往虚拟机中切换. 这里面涉及到一个关键问题就是虚拟机中的 IP 不断变化,而设置静态 IP 又略显麻烦, 而且有时候还不一定行得通,比如当你连接移动,电信或者联通提供的无线 WIFI 时, 你设置静态 IP 后很有可能导致你连不上网络.更别说虚拟机了.经过一番探究可以如下做, 而不用考虑 IP 地址的变化.

首先安装 ssh,在 ubuntu 16.04 上安装方式如下:

sudo apt-get install openssh-client openssh-server

启动 ssh 服务的命令如下:

sudo /etc/init.d/ssh start

你可以修改 ssh 的默认服务端口(22),编辑 /etc/ssh/sshd_config 这个文件里面的 Port 值 ,然后重启 ssh: sudo /etc/init.d/ssh restart

然后确保你设置的虚拟机网络连接方式为NAT模式,然后虚拟机已经关闭.获取VirtualBox中的虚拟机名称:

 VBoxManage list vms | awk -F\" '{print $2}' 

在列出的虚拟机名称中选择一个,设置主机端口3022,虚拟机端口22,如下所示:

 VBoxManage modifyvm  "Ubuntu 16.04 x64 Server" --natpf1 "sshserver,tcp,,3022,,22" 

其命令格式为:

--natpf<1-N> [<name>],tcp|udp,[<hostip>],<hostport>,[<guestip>], <guestport>

其中 "Ubuntu 16.04 x64 Server"是虚拟机名称, --natpf代表的是NAT Port Forwarding, 它指明了端口转发规则, 1是网卡号,双引号里面的 sshserver是一个描述性字段,可按需随意填写, tcp是所使用的协议,主机IP省略和端口 3302, 虚拟机IP省略和虚拟机端口 22.通常地, 我们只需要安装上面的例子设置端口.只要端口号能用即可.缺省的IP地址为127.0.0.1

设你的虚拟机中服务器的名字为server,在主机上用ssh连接虚拟机上可以这样做:

ssh -p 3022 server@127.0.0.1

设置自动登陆:

sudo vim /etc/systemd/system/getty.target.wants/getty@tty1.service
#修改[Service]中的"ExecStart"一行为如下:
#其中user-name为你要自动登陆的用户名称.
ExecStart=-/sbin/agetty -a user-name %I $TERM

Reference

  1. how-to-ssh-to-a-virtualbox-guest-externally-through-a-host
  2. Chapter 6. Virtual networking
  3. Chapter 8. VBoxManage
  4. Test upgrade from 14.04 server to 16.04: Auto login fails




如有问题可以通过我的邮箱dXAyZ2Vla0AxNjMuY29tCg==或者新浪微博:bugnofree联系我.