batch rechner übers netzwerk neustarten

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
OnkelDave
Beiträge: 231
Registriert: 30.11.2009 16:21:13

batch rechner übers netzwerk neustarten

Beitrag von OnkelDave » 09.12.2009 10:45:37

moin @ all,
habe ein script was die rechner übers netzwerk neustartet! (batch)

nun möchte ich einen weiteren punkt einfügen, das man alle aufgelisteten rechner neustarten kann.

wie erstellt man in der batch ein array oder ähnliches, wo man sich auf die arrayvariable beziehen kann wo alle ips drinstehen?

das hauptproblem ist, das ich die rechner erst auf erreichbarkeit prüfe und sie dann per goto zum reboot schicke!
also nehmen wir den fall das ich alle rechner neustarten möchte und er prüft den ersten und springt dann per goto zum reboot, dann wars das fürs programm und er ignoriert logischerweise alle anderen computer...möchte ihn jetzt nicht wieder zurückschicken und dann beim zweiten weitermachen lassen, am besten wär wenn er alle auf einmal prüft und dann ausgibt wer nicht erreichbar ist!

danke
gruß dave

uname
Beiträge: 12424
Registriert: 03.06.2008 09:33:02

Re: batch rechner übers netzwerk neustarten

Beitrag von uname » 09.12.2009 11:46:56

Vielleicht so. Arrays kann man vielleicht optimaler programmieren oder aus einer Datei einlesen. Doof ist, dass "ping" eine Sekunde lang wartet bis es wirklich feststellt, dass der Rechner (hier 10.0.0.1) nicht erreichbar ist. Kann man vielleicht noch optimieren. SSH-Keys muss man natürlich austauschen oder den SSH-Befehl durch einen Reboot-Befehl ersetzen.

Code: Alles auswählen

#!/bin/bash

ip[1]="127.0.0.1"
ip[2]="10.0.0.1"

for element in $(seq 1 $((${#ip[@]} )))
do
  i="${ip[$element]}"; 
  output=`/bin/ping -c 1 -i 1 $i | /bin/fgrep icmp_seq`;
  if [ -n "$output" ]; then
    output=`/usr/bin/ssh root@$i /sbin/reboot`;
    echo $output; 
  fi 
done

Benutzeravatar
GoKi
Beiträge: 2068
Registriert: 04.07.2003 23:08:56
Lizenz eigener Beiträge: MIT Lizenz

Re: batch rechner übers netzwerk neustarten

Beitrag von GoKi » 09.12.2009 12:06:55

Nur mal am Rande: Man kann den Exit-Status von ping auswerten, um zu sehen ob ein Host erreichbar ist.
man bash hat geschrieben: If ping does not receive any reply packets at all it will exit with
code 1. If a packet count and deadline are both specified, and fewer
than count packets are received by the time the deadline has arrived,
it will also exit with code 1. On other error it exits with code 2.
Otherwise it exits with code 0. This makes it possible to use the exit
code to see if a host is alive or not.

Code: Alles auswählen

$ ping -c1 -w1 chunky >/dev/null 2>&1; echo $?
1
$ ping -c1 -w1 brixx >/dev/null 2>&1; echo $?
0
MfG GoKi
:wq

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: batch rechner übers netzwerk neustarten

Beitrag von nepos » 09.12.2009 12:12:45

Und dafür brauchst du hier nicht mal einen Array. In der Shell reichts auch, die Liste z.B. so anzugeben:

Code: Alles auswählen

liste="rechner1 rechner2 rechner3 rechner4"
for r in $rechner; do
    ... kommando für reboot ...
done

uname
Beiträge: 12424
Registriert: 03.06.2008 09:33:02

Re: batch rechner übers netzwerk neustarten

Beitrag von uname » 09.12.2009 14:22:03

Ok, mein Programm war zu kompliziert. Als Einzeiler ist es auch gleich viel übersichtlicher:

Code: Alles auswählen

for r in `cat rechner.txt`; do ping -c1 -w1 $r >/dev/null 2>&1; if [ "$?" -eq 0 ]; then ssh root@$r /sbin/reboot ; fi; done  
Nun würde ich gerne noch "ping" direkt in den if-Teil bringen, um das Programm weiter zu minimieren. Hat jemand eine Idee?

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: batch rechner übers netzwerk neustarten

Beitrag von nepos » 09.12.2009 18:33:05

Code: Alles auswählen

for r in `cat rechner.txt`; do ping -c1 -w1 $r >/dev/null 2>&1 && ssh root@$r /sbin/reboot ; fi; done 

uname
Beiträge: 12424
Registriert: 03.06.2008 09:33:02

Re: batch rechner übers netzwerk neustarten

Beitrag von uname » 10.12.2009 09:22:03

Danke. Das "fi" war jedoch nun falsch. Also nun so:

Code: Alles auswählen

for r in `cat rechner.txt`; do ping -c1 -w1 $r >/dev/null 2>&1 && ssh root@$r /sbin/reboot ; done 

nepos
Beiträge: 5238
Registriert: 05.01.2005 10:08:12

Re: batch rechner übers netzwerk neustarten

Beitrag von nepos » 10.12.2009 11:26:50

Ups sorry, das hatte ich übersehen.

OnkelDave
Beiträge: 231
Registriert: 30.11.2009 16:21:13

Re: batch rechner übers netzwerk neustarten

Beitrag von OnkelDave » 28.12.2009 15:37:04

wow es geht sogar bei redhat systemen! RESPEKT!
könnte mir dann noch schnell jemand sagen wie ich sone liste unter windows in einer batch datei realisiere???

Code: Alles auswählen

:all
SET server=list
list="192.168.10.25 192.168.10.26 192.168.10.27"
goto accessible
so ungefähr soll das aufgebaut sein, egal was davor und dahinter nun passiert. ich möchte einfach mehrere auf einmal verarbeiten!

Bitte um eure Hilfe

gruß david

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: batch rechner übers netzwerk neustarten

Beitrag von gms » 28.12.2009 16:46:31

OnkelDave hat geschrieben: könnte mir dann noch schnell jemand sagen wie ich sone liste unter windows in einer batch datei realisiere???

Code: Alles auswählen

set liste=a b c d
for %%i in (%liste%) do (
  echo %%i
)
du könntest diese Liste aber hier aus einer Textdatei einlesen ( mittels "for /f ..." )

Gruß
gms

OnkelDave
Beiträge: 231
Registriert: 30.11.2009 16:21:13

Re: batch rechner übers netzwerk neustarten

Beitrag von OnkelDave » 28.12.2009 17:05:58

ok habs eben so gelöst..

Code: Alles auswählen

:all
FOR /F "tokens=1" %%i IN (rechner.txt) DO net view \\%%i >nul 2>nul
if errorlevel 1 (GOTO networkDown) else GOTO rebootOrShutdown
aber so nimmt er immer nur den letzten eintrag aus der rechner.txt :(
einer ne idee wie man eine schleife drum baut, sodass er alle ausprobiert??

Danke schonmal für eure Mühe!

gms
Beiträge: 7798
Registriert: 26.11.2004 20:08:38
Lizenz eigener Beiträge: MIT Lizenz

Re: batch rechner übers netzwerk neustarten

Beitrag von gms » 28.12.2009 17:34:40

OnkelDave hat geschrieben: einer ne idee wie man eine schleife drum baut, sodass er alle ausprobiert??
z.B so: ( ungetestet)

Code: Alles auswählen

:all
FOR /F  %%i IN (rechner.txt) DO call :networkTest %%i
goto :EOF

:networkTest
net view \\%1
if errorlevel 1 goto :networkDown
goto :rebootOrShutdown


:networkDown
echo %1 is down
goto :EOF

:rebootOrShutdown
echo %1 is up
goto :EOF

Antworten