Ik heb daarvoor de Windows-commandlinetool plink gebruikt om via SSH verbinding te maken met Linux-systemen en daar commando’s uit te voeren. Daaromheen heb ik een batchscript geschreven dat die stap automatisch herhaalt voor elk Linux-systeem dat in een apart bestand staat.
Het script haalt de hostnamen van de Linux-systemen uit een tekstbestand en geeft die door aan de Windows-commandlinetool om commando’s op het externe systeem uit te voeren. Ook die commando’s staan in een apart bestand. Je hoeft alleen uit te zoeken welke commando’s zonder tussenkomst van de gebruiker kunnen draaien.
Uitleg met een voorbeeld: DNS-instellingen op afstand aanpassen
Deze oplossing voor beheer op afstand bestaat uit de volgende bestanden:
- Bestand — Omschrijving
- Run.bat — Hoofdscript om de uitvoering van de externe commando’s te starten.
- Remote_systems.txt — Lijst met alle externe systemen.
- sub_run.bat — Subscript dat plink.exe aanroept.
- Remote_commands.txt — Linux-commando’s die op het externe systeem draaien.
- plink.exe — Windows-commandlinetool om verbinding te maken met het externe systeem.
- logging.txt — Logbestand met de uitvoer.
Run.bat
for /F “tokens=1” %%a in (remote_systems.txt) do call sub_run.bat %1 %2 %%a
Dit is het hoofdbestand dat je draait om de uitvoering van de externe commando’s te starten.
Open een nieuwe opdrachtprompt, ga naar de map met de scriptbestanden en gebruik het onderstaande commando (vervang gebruikersnaam en wachtwoord door de jouwe. Dit account wordt voor alle externe systemen gebruikt.):
Run.bat <username> <password>
Voor elk extern systeem in remote_systems.txt wordt het bestand sub_run.bat aangeroepen.
De opgegeven gebruikersnaam (%1), het wachtwoord (%2) en de systeemnaam (%aa) worden doorgegeven aan sub_run.bat.
remote_systems.txt
hostname1
hostname2
192.168.1.25
192.168.1.73
In dit bestand zet je alle systemen die je op afstand wilt beheren. Dat mag de hostnaam zelf zijn of het IP-adres.
sub_run.bat
echo yes | plink.exe -ssh -pw %2 %1@%3 -m remote_commands.txt >> logging.txt
Dit bestand vangt de argumenten voor gebruikersnaam, wachtwoord en systeemnaam op en geeft ze door aan de commandlinetool plink.exe voor de externe verbinding. De commando’s die op afstand moeten draaien, worden uit remote_commands.txt gelezen.
“echo yes | “ gebruik je om de vraag “Store key in cache?” met ja te beantwoorden. Anders moet je die vraag voor elk extern systeem beantwoorden.
remote_commands.txt
In het onderstaande voorbeeld laat ik zien hoe je de DNS-instellingen van Linux-systemen op afstand aanpast. Vervang simpelweg de inhoud van dit bestand om andere taken op de externe systemen uit te voeren. Het is belangrijk om een gericht commando op te geven, zodat er geen invoer van de gebruiker nodig is. Zoek op een referentiesysteem de juiste commando’s uit om je doel te bereiken.
#VERIFY SYSTEMS’ IP ADDRESS TO COULD DEFINE THE NEW DNS SETTING
IP=`ifconfig eth0 2>/dev/null|awk ‘/inet addr:/ {print $2}’|sed ‘s/addr://’`
#NEW DNS SETTINGS
#AMSTERDAM SYSTEMS
if [[ $IP == *172.168.* ]]
then
DOMAIN=amsterdam.com
DNS1=172.168.1.1
DNS2=172.128.1.1
fi
#LONDON SYSTEMS
if [[ $IP == *172.128.* ]]
then
DOMAIN=london.com
DNS1=172.128.1.1
DNS2=172.168.1.1
fi
# LOG CURRENT DNS SETTINGS
echo DNS settings BEFORE
cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep ‘DOMAIN\|DNS’
# CLEAR PREVIOUS DNS SETTINGS
sed -i ‘/^DNS.*/d;/^DOMAIN.*/d’ /etc/sysconfig/network-scripts/ifcfg-eth0
rm -f /etc/resolv.conf
# SET NEW DNS SETTINGS
echo -e $”DOMAIN=$DOMAIN\nDNS1=$DNS1\nDNS2=$DNS2″ >> /etc/sysconfig/network-scripts/ifcfg-eth0
# LOG NEW DNS SETTINGS
echo DNS settings AFTER
cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep ‘DOMAIN\|DNS’
plink.exe
Dit is de Windows-commandlinetool om verbinding te maken met de externe systemen en daar de commando’s uit te voeren. Je kunt hem downloaden van http://www.putty.org.
Logging.txt
De uitvoer wordt weggeschreven naar het bestand logging.txt. Dat bestand wordt automatisch aangemaakt.