-
-
Save drewreece/1239489 to your computer and use it in GitHub Desktop.
#!/bin/sh | |
# hosts-to-vm.sh | |
# | |
# Made for use alongside the excellent ievms - | |
# https://github.com/xdissent/ievms | |
# | |
# Will export the local hosts (from /etc/hosts) | |
# to a batch script & add that batch script to a Windows VM | |
# The batch script will be executed to import the hosts onto the VM | |
# The batch file seems convoluted, until you only want to append the new hosts. | |
# | |
# REQUIREMENTS : | |
# VirtualBox & Guest Additions installed (v4.0 or greater) on the guest | |
# VirtualBox command line tools installed on the host | |
# Local hosts defined in /etc/hosts using 127.0.0.1 address. | |
# VM's setup via ievms.sh - the user listed below must be an admin on the VM. | |
# | |
# OVERVIEW : | |
# 1 Parse local (127.0.0.1 ONLY) hosts to a list | |
# 2 Create a .bat file to copy to the Windows VM disk | |
# 3 Loop over hosts, adding commands to batchfile. | |
# 4 Copy batchfile to C:\ of Administrator in the VM | |
# 5 Execute the batch | |
# | |
# For info on getting UAC on Windows from within batch script see | |
# http://www.sevenforums.com/general-discussion/12936-how-run-batch-file-admin-2.html?s=0c0b169bcd910dc62c1adc18ef279179 | |
# | |
# | |
# USAGE: | |
# Call with Virtualbox VM name, or without args to see usage. | |
# hosts-to-vm.sh "VM - Name" [ "VM2 - Name" "VM3 - Name" ... ] | |
# | |
# To run on all | |
# ./hosts-to-vm.sh "IE6 - WinXP" "IE7 - WinXP" "IE8 - WinXP" "IE9 - Win7" "IE10 - Win7" "IE11 - Win7" | |
# | |
# CONFIG | |
########################################################### | |
# VM admin username | |
USERNAME='IEUser' | |
# VM admin user password | |
PASSWD='Passw0rd!' | |
# check delay when starting VM's | |
sleep_wait="5" | |
########################################################### | |
# The generated batch file | |
BATCHFILE="/tmp/hosts.bat" | |
# Source hosts file | |
HOSTS="/etc/hosts" | |
# Helpers | |
SCRIPT=`basename "$0"` | |
IP=`ifconfig | grep "inet " | grep -v 127.0.0.1 | cut -d\ -f2` | |
# Requires VM pass it as arg1 | |
if [[ -z $1 ]]; then | |
echo " NAME | |
${SCRIPT} | |
USAGE | |
Specify at least one Virtual Machine to use. | |
Call the script as follows on the host | |
${SCRIPT} \"VM - Name\" [ \"VM2 - Name\" \"VM3 - Name\" ... ] | |
Edit this script if you want to avoid overwriting the Windows hosts file. | |
See OVERWRITE comment in get_hosts function in ${SCRIPT} | |
${SCRIPT} \"VM - Name\" | |
A hosts.bat is generated, copied to the VM and then run. | |
The VM will launch, the Windows Console should open & disappear. | |
The hosts.bat can be re-run, it will request admin priveledges via UAC | |
The batch file will remain in the users home directory. | |
UAC on Windows 7 - USER INTERACTION REQUIRED INSIDE THE VM. | |
Manually agree to run the hosts.bat file with admin privileges on Windows 7 VM's. | |
The new hosts file in Windows uses the hosts IP address, | |
127.0.0.1 would resolve to the VM, not the host OS. | |
Ensure the guest has a static IP on the primary interface or | |
re-run this script to overwrite the hosts file. | |
" | |
exit 0 | |
fi | |
# Get local hostnames on the host machine | |
# batch file requires header to disable echo, | |
# request admin priveldges on via UAC | |
function get_hosts() { | |
HOSTLIST=`awk '/localhost/ || /broadcasthost/ || /^#/ {next}; /127.0.0.1/ {print $2}' "${HOSTS}"` | |
# Setup batch file | |
touch "${BATCHFILE}" | |
#### Will OVERWRITE hosts file on VM unless you remove the echo. >NUL 2>%hostspath% | |
cat > "${BATCHFILE}" <<"BATCHHEADER" | |
@echo off | |
net session >NUL 2>&1|| powershell Start-Process '%0' -Verb RunAs&& exit /b|| exit /b | |
set hostspath=%windir%\System32\drivers\etc\hosts | |
echo. >NUL 2>%hostspath% | |
BATCHHEADER | |
# for each host add a line to create it in our batchfile... | |
# echo local-IP-addr host.name >> %hostspath% | |
for host in "${HOSTLIST}" ; do | |
echo "echo ${IP} ${host} >> %hostspath%" >> "${BATCHFILE}" | |
done | |
# Add the script closure to the batch file | |
cat >> "${BATCHFILE}" << 'CLOSURE' | |
exit | |
CLOSURE | |
} | |
# function taken from ievms | |
# Pause execution until guest control is available for a virtual machine | |
wait_for_guestcontrol() { | |
while true ; do | |
echo "Waiting for ${1} to be available for guestcontrol..." | |
sleep "${sleep_wait}" | |
VBoxManage showvminfo "${1}" | grep 'Additions run level:' | grep -q "3" && return 0 || true | |
done | |
} | |
# Is it a virtual machine in VirtualBox? | |
is_vm() { | |
VBoxManage showvminfo "${1}" >/dev/null 2>&1 | |
if [[ "$?" -ne "0" ]]; then | |
return 1 | |
fi | |
} | |
get_hosts | |
# Quote to allow for spaces in arguments | |
for VM in "$@" ; do | |
# sanity check | |
is_vm "${VM}" | |
if [[ "$?" -eq "0" ]]; then | |
STATE=`VBoxManage showvminfo "${VM}" | awk '/State/ {print $2}'` | |
if [[ "${STATE}" != 'running' ]]; then | |
echo "The virtual machine ${VM} is not running ... starting it" | |
VBoxManage startvm "${VM}" | |
fi | |
wait_for_guestcontrol "${VM}" | |
# Import the batch to the VM | |
# Using windows back slashes fails | |
# Copying into user directory | |
# Win 7 has different path, check os version | |
echo "Copying ${BATCHFILE} to ${VM}" | |
WIN_OS_VER=$(VBoxManage showvminfo --machinereadable "${VM}" | grep "ostype=" | cut -d '=' -f2 | sed 's/\"//g' ) | |
#echo "${WIN_OS_VER}" | |
if [[ ${WIN_OS_VER} == "Windows 7 (32 bit)" ]]; then | |
VBoxManage guestcontrol "${VM}" cp "${BATCHFILE}" "C:/Users/IEUser/hosts.bat" --username "${USERNAME}" --password "${PASSWD}" --verbose | |
VBoxManage guestcontrol "${VM}" exec "C:/Users/IEUser/hosts.bat" --username "${USERNAME}" --password "${PASSWD}" --verbose | |
echo "Check for UAC popup in taskbar in ${VM}" | |
fi | |
if [[ ${WIN_OS_VER} == "Windows XP (32 bit)" ]]; then | |
VBoxManage guestcontrol "${VM}" cp "${BATCHFILE}" "C:/Documents and Settings/IEUser/hosts.bat" --username "${USERNAME}" --password "${PASSWD}" --verbose | |
VBoxManage guestcontrol "${VM}" exec "C:/Documents and Settings/IEUser/hosts.bat" --username "${USERNAME}" --password "${PASSWD}" --verbose | |
fi | |
else | |
echo "ERROR ${VM} is not a virtual machine in VirtualBox... skipping." | |
fi | |
done | |
# Cleanup local copy | |
rm "${BATCHFILE}" | |
exit 0 |
Does this still work? The Administrator
/Password1
combo doesn't let me log in. Using IEUser
/Passw0rd!
does let me log in but nothing appears to happen when I try to exec
the bat file:
VBoxManage guestcontrol "IE9 - Win7" exec "/Documents and Settings/IEUser/Desktop/hosts.bat" --username IEUser --password Passw0rd\! --verbose
Opening guest session as user 'IEUser' ...
Waiting for guest session to start ...
Guest session (ID 2) has been started
Starting guest process ...
[2588 - Session 2]
Guest session detached
Inspecting the Windows hosts
file shows it hasn't been updated.
Thanks chaffeqa, I have probably botched the merge, but it should be there now.
airblade, this should work now.
The Windows 7 VM's needed to request admin level access & that was failing along with the new user & password.
Apologies for being slow to resolve this - if you know how I can get notifications from github comments that would be great :)
@drewreece It works now – fantastic!
Not sure how to get notifications from comments; I assumed they happened automatically.
Great, thanks for the input.
I expect the notifications are off because gists don't support them or maybe I have a cheapskate free account :)
Per link in http://stackoverflow.com/a/17094284/406725
ievms by default creates VM's titled:
IE7 - WinXP
To account for passing in arguments with spaces ( VM names ) change:
Or you can copy my fork ( change + comments ): https://gist.github.com/chaffeqa/8922736/revisions