I have been running some server instances in VirtualBox recently and as I move between networks it is a pain to have to log in and get the IP address from ipconfig before being able to access the test web sites I have running in them. I also prefer to SSH to them rather than use the VirtualBox instance (it gives better character screen size, although I could reconfigure things; I also tab my terminals).
Anyway, in order to make things easier I put together two scripts, one that handles getting the IP address of the Virtualbox instance, and the other that handles connecting via SSH just by telling it the instance name. In order to do this you need to install the VirtualBox Guest Additions. This package is generally used in connection with video drivers for GUI based guests, but it also has some extensions that present extra information about the guest to the host machine.
Installing on Ubuntu is quite easy. My setup is using Ubuntu 12.10 on the desktop (host) and Ubuntu 12.04 LTS on the server (guest). To start with there is a package with the Guest Additions ISO in, so start by installing it with:
sudo aptitude install virtualbox-guest-additions-iso
Next you need to mount the ISO in the guest OS. To do this choose the Install Guest Additions option from the Devices menu. Since this is a CLI server OS it won’t automatically mount the ISO, so you will have to do this manually with:
sudo mount /dev/cdrom /media/cdrom
Once you have done this you need to install dkms and then run the install script with:
sudo aptitude install dkms
sudo /media/cdrom/VBoxLinuxAdditions.run
It will complain about not having found X to install the graphics drivers, but this isn’t a problem.
Once you have done this you can use the command:
VBoxManage guestproperty enumerate <vname>
where <vname> is the name of your guest. This will list out all of the available information that can now be accessed.
Using this command in a little bit of bash I created the two scripts. Firstly to get the IP address of a named guest:
#! /bin/bash
VIP=`VBoxManage guestproperty get $1 "/VirtualBox/GuestInfo/Net/0/V4/IP" | awk '{print $2}'`
echo $VIP
Secondly, to SSH to a named guest:
#! /bin/bash
VIP=`VBoxManage guestproperty get $1 "/VirtualBox/GuestInfo/Net/0/V4/IP" | awk '{print $2}'`
ssh-keygen -f "/home/paul/.ssh/known_hosts" -R $VIP
ssh $VIP
This second one is a little more involved because it first deletes the entry from the known_host file (remember to change the location). I’ve done this to stop an error coming up if the IP address has already been used, which isn’t uncommon with DHCP leases (you often get the same one, but not always!). You will have to confirm the authenticity of the host each time you connect, but since this is scripted and the IP has been automatically obtained locally to the machine this shouldn’t present a security risk.
Update: an improved version of the above script that simply ignores the information in the known_hosts file is (thanks popey I should have remembered that one!):
#! /bin/bash
VIP=`VBoxManage guestproperty get $1 "/VirtualBox/GuestInfo/Net/0/V4/IP" | awk '{print $2}'`
ssh -o StrictHostKeyChecking=no $VIP
Each of these scripts takes the guest name as a parameter, eg:
vbip Alfresco
or
vssh Alfresco
Lastly, to make these new scripts easy to use I created a .bash_aliases file in my home directory with the following:
## custom aliases
alias vssh='~/scripts/vssh'
alias vbip='~/scripts/vbip'
You will need to adjust for whever you have put these scripts, I tend to have a scripts directory in my home directory for this purpose.