Mixed Environment Shutdown Script

2 minute read


So for my VMWare lab, I have quite a few servers: 4 Windows VMs 1 RHEL 7 VM 2 Centos VMs 1 PFSense VM 1 W10 VM with WSL installed that I used as my ‘admin’ machine so I could PS remote to the Windows Servers and WSL ssh into the Linux/PFSense VMs.

My goal was to create a simple way to shutdown my lab at the end of the day since it was on a laptop that I take home.

I already had a startup script for Windows boots:

@ echo off
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\scripts\vms\pfsense\pfsense.vmx" nogui
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\scripts\vms\2016dc\2016dc.vmx" nogui
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\scripts\vms\puppet\puppet.vmx" nogui
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\scripts\vms\2012dc\2012dc.vmx" nogui
"C:\Program Files (x86)\VMware\VMware Workstation\vmrun.exe" -T ws start "C:\scripts\vms\2016client\2016client.vmx" nogui

I’m sure there is a simple VMWare way, but I wanted to initiate the shutdown of the lab from a single machine. Since I’m fairly good with Powershell, it was easy to write a function for the Windows VM’s, but I needed to find a way to shutdown my linux/BSD machines.

To Resolve

  1. The way to do this is to setup PublicKeyAuthentication and then create a shell script that would shutdown my VMs
  • To do this, you first create your own key and send it to the servers:
ssh-keygen -t rsa
# cat /home/gerry/.ssh/id_rsa.pub - Copy this somewhere just in case, it is your public key. The same directory has your private key.
ssh-copy-id gerry@puppet.williamsg.test

# ssh in and then run
sudo su
vi /etc/ssh/sshd_config
# Set 'PubkeyAuthentication' to 'yes' and 'PasswordAuthentication' to 'no'
cat /home/gerry/.ssh/authorized_keys
# make sure it matches
systemctl restart sshd

# Now it should work!
  • This worked easy enough. But I ran into an issue:
ssh gerry@puppet.williamsg.test "sudo /usr/sbin/shutdown now"
sudo: no tty present and no askpass program specified
  • fix:
echo "pass" | ssh -t gerry@puppet.williamsg.test "sudo -S /usr/sbin/shutdown now"
  1. Since that took care of my Linux VM’s, I just had PFSense left. Here is what I did to set it up:
  • Login to web gui
  • System - Advanced - Enable SSH - Also check box to disable passwords
  • On admin box: cat ~/.ssh/id_rsa.pub - Copy to clipboard
  • Back in Web GUI, go to User Manager - YourUser - Paste in to authorized_keys file
  • Back on admin, create script: ssh yourUser@ 'poweroff -p now'
  1. So now I have a function in my Powershell profile that will shutdown windows VMs and a bash script in my WSL tab that I run to shutdown the rest.
  • Here is Windows function:
# Encryption
# $Key = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)
# Read-Host -Assecurestring | Convertfrom-Securestring -Key $Key | Out-File 'C:\Users\gerry.WILLIAMSG\Documents\WindowsPowershell\pw.xml'
# Decryption
$Key = (3, 4, 2, 3, 56, 34, 254, 222, 1, 1, 2, 23, 42, 54, 33, 233, 1, 34, 2, 7, 6, 5, 35, 43)
$Password = Get-Content 'C:\Users\gerry.WILLIAMSG\Documents\WindowsPowershell\pw.xml' | Convertto-Securestring -Key $Key
$Username = "williamsg.test\gerry"
$Cred = New-Object -Typename System.Management.Automation.Pscredential -Argumentlist $Username, $Password

Function Set-LabSessions
    $2016dc = New-PSSession -ComputerName "2016dc" -Credential $cred
    $2012dc = New-PSSession -ComputerName "2012dc" -Credential $cred
    $2012client = New-PSSession -ComputerName "2012client" -Credential $cred
    $2016client = New-PSSession -ComputerName "2016client" -Credential $cred

$servers = @("2016dc", "2012dc", "2016client", "2012client")
#Enter-pssession $2016dc

Function Stop-Lab
    invoke-command -ComputerName $servers -scriptblock { stop-computer -force }