Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 27.09.2011 16:45:15
Hi,
ich habe so ein schönes Script, dass überprüft welche IPs noch online sind.
Code: Alles auswählen
#!/bin/sh
echo "Starting autoshutdown.sh ..."
beep -f2000 -r2
# Liste der zu überwachenden Computer
IP1=192.168.22.5
IP2=192.168.22.30
IP3=192.168.22.31
if (ping -c 3 $IP1 || ping -c 3 $IP2 || ping -c 3 $IP3 ||\
(echo "90 Sekunden Tiefschlaf"; sleep 90; ping -c 3 $IP1) || ping -c 3 $IP2 || ping -c 3 $IP3)
then
echo "Mindestens 1 Client am Netz. "
else
echo "Alle Clients offline, Server wird heruntergefahren. "
# Eintrag ins Logfile
echo "Alle Clients offline, Server wird heruntergefahren. " | logger -i -t autoshutdown.sh
beep -f2000 -r4
sleep 15
beep -f2000 -r4
echo "Server Auto Shutdown.." `date +%d.%m.%Y-%H:%M`>>/home/daten/updowntime.txt
/sbin/shutdown -h 1
fi
echo "Ende von autoshutdown.sh ..."
# beep -f3000
exit 0
Nun hätte ich das gerne so geändert, dass die zu pingenden IPs (egal wie viele) aus einer Datei geholt werden.
Habe es probier mit
Aber ich bekomme es nicht so richtig ans laufen.
Brett vorm Kopf heute
Kann mir da mal jemand helfen ???
-
slu
- Beiträge: 2234
- Registriert: 23.02.2005 23:58:47
Beitrag
von slu » 27.09.2011 16:53:22
So ungefähr, hab es nicht getestet!
Code: Alles auswählen
#!/bin/sh
echo "Starting autoshutdown.sh ..."
beep -f2000 -r2
# Liste der zu überwachenden Computer
cat /tmp/clients.txt | while read DESTHOST ; do
if ping -c 3 $DESTHOST ; then
echo "Mindestens 1 Client am Netz. "
else
echo "Alle Clients offline, Server wird heruntergefahren. "
# Eintrag ins Logfile
echo "Alle Clients offline, Server wird heruntergefahren. " | logger -i -t autoshutdown.sh
beep -f2000 -r4
sleep 15
beep -f2000 -r4
echo "Server Auto Shutdown.." `date +%d.%m.%Y-%H:%M`>>/home/daten/updowntime.txt
/sbin/shutdown -h 1
fi
echo "Ende von autoshutdown.sh ..."
# beep -f3000
done
exit 0
Edit:
Es stimmt noch nicht ganz, denn beim ersten Offline Client würde er herunterfahren. Man müsste sich das also z.B. in eine Variable schreiben und zum Schluss prüfen ob alle Clients Offline sind und dann den shutdown ausführen.
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 27.09.2011 16:58:07
Findest du hier noch nen Fehler ?
Code: Alles auswählen
#!/bin/sh
echo "Starting autoshutdown.sh ..."
beep -f2000 -r2
if
while read IP4
do
(ping -c 3 $IP4 ||\
(echo "90 Sekunden Tiefschlaf"; sleep 9; ping -c 3 $IP4))
done < /home/daten/Daten/ips.txt
then
echo "Mindestens 1 Client am Netz. "
else
echo "Alle Clients offline, Server wird heruntergefahren. "
# Eintrag ins Logfile
echo "Alle Clients offline, Server wird heruntergefahren. " | logger -i -t autoshutdown.sh
beep -f2000 -r4
sleep 15
beep -f2000 -r4
echo "Server Auto Shutdown.." `date +%d.%m.%Y-%H:%M`>>/home/daten/updowntime.txt
# /sbin/shutdown -h 1
fi
echo "Ende von autoshutdown.sh ..."
# beep -f3000
exit 0
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 27.09.2011 17:01:34
Das Konstrukt
Code: Alles auswählen
#!/bin/sh
cat 'list.txt' | while read LINE; do
echo "Und noch 'ne Zeile: $LINE"
done
funktioniert einwandfrei.
Vielen Dank @ slu, vor wenigen Tagen hatte ich schon einmal erfolglos diese Funktion nachzubauen versucht.
Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 27.09.2011 17:40:49
@slu
Du hast recht. Genau da hängt es.
Ich dachte schon es geht, aber bei mir sagt er erste ip ist da, zweite ip ist offline, also shutdown.
Ich hänge momentan hier...
Code: Alles auswählen
#!/bin/sh
if
while read IP
do
(ping -c 3 $IP ||\
(echo "9 Sekunden Tiefschlaf"; sleep 9; ping -c 3 $IP))
done < /home/daten/Daten/script/iplist.txt
then
echo "Mindestens 1 Client am Netz. "
else
echo "Alle Clients offline, Server wird heruntergefahren. "
# Eintrag ins Logfile
echo "Alle Clients offline, Server wird heruntergefahren. " | logger -i -t autoshutdown.sh
beep -f2000 -r4
sleep 15
beep -f2000 -r4
echo "Server Auto Shutdown.." `date +%d.%m.%Y-%H:%M`>>/home/daten/updowntime.txt
# /sbin/shutdown -h 1
fi
echo "Ende von autoshutdown.sh ..."
# beep -f3000
exit 0
Vielleicht hat ja noch einer ne Idee ???
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 27.09.2011 18:13:31
Huck Fin hat geschrieben:Vielleicht hat ja noch einer ne Idee ???
Der erste und wichtigste Schritt ist immer zu vereinfachen. Eine grosse Hilfe dabei ist es Unix-Style statt Pascal-``Strukturierte Programmierung''-Stil zu verwenden. D.h. fruehe Ausstiege zu verwenden.
Wichtig ist zudem dir klar zu machen was genau du willst: Sobald du einen Client findest der online ist beendet das Script ohne etwas zu tun. Sonst faehrt es den Rechner runter.
Ich habe das mal fuer dich gemacht:
Code: Alles auswählen
#!/bin/sh
while read IP
do
if ping -c 3 $IP || (echo "9 Sekunden Tiefschlaf"; sleep 9; ping -c 3 $IP)
then
echo "Mindestens 1 Client am Netz. "
exit
fi
done < /tmp/iplist.txt
msg="Alle Clients offline, Server wird heruntergefahren. "
echo "$msg"
echo "$msg" | logger -i -t autoshutdown.sh
beep -f2000 -r4
sleep 15
beep -f2000 -r4
echo "Server Auto Shutdown.." `date +%d.%m.%Y-%H:%M`>>/home/daten/updowntime.txt
# /sbin/shutdown -h 1
echo "Ende von autoshutdown.sh ..."
# beep -f3000
exit 0
Use ed once in a while!
-
Cae
- Beiträge: 6349
- Registriert: 17.07.2011 23:36:39
- Wohnort: 2130706433
Beitrag
von Cae » 27.09.2011 18:40:05
@Huck Fin: Bei der Wartezeit hat sich über drei Posts ein Fehler eingeschlichen, der im Dritten elegant korrigiert wurde.
Wir sagen 90 Sekunden und warten eineinhalb Minuten:
Huck Fin hat geschrieben:Code: Alles auswählen
if (ping -c 3 $IP1 || ping -c 3 $IP2 || ping -c 3 $IP3 ||\
(echo "90 Sekunden Tiefschlaf"; sleep 90; ping -c 3 $IP1) || ping -c 3 $IP2 || ping -c 3 $IP3)
Wir behaupten 90 Sekunden, warten aber nur 9 Sekunden:
Huck Fin hat geschrieben:Code: Alles auswählen
(ping -c 3 $IP4 ||\
(echo "90 Sekunden Tiefschlaf"; sleep 9; ping -c 3 $IP4))
Wir schreiben und warten 9 Sekunden:
Huck Fin hat geschrieben:Code: Alles auswählen
(ping -c 3 $IP ||\
(echo "9 Sekunden Tiefschlaf"; sleep 9; ping -c 3 $IP))
Nur so
Gruß Cae
If universal surveillance were the answer, lots of us would have moved to the former East Germany. If surveillance cameras were the answer, camera-happy London, with something like 500,000 of them at a cost of $700 million, would be the safest city on the planet.
—Bruce Schneier
-
rendegast
- Beiträge: 15041
- Registriert: 27.02.2006 16:50:33
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von rendegast » 27.09.2011 19:46:39
Zuletzt geändert von
rendegast am 27.09.2011 19:54:34, insgesamt 1-mal geändert.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 27.09.2011 19:54:16
Das mit den 90 sec habe ich auf 9 sec geändert, weil im test dauert das zu lange.
1000 Dank für die Lösung.
Test geht suuuper.
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 11.10.2011 23:29:55
Kann ich irgendwie noch abfragen, ob jemand per FTP verbunden ist ?
Da wird es mit der IP-Abfrage schwierig, weil der Benutzer kommt von
aussen durch die FritzBox über eine Portweiterleitung.
Ich habe Proftpd im Eimnsatz.
Ich möchte verhindern, dass der Server ausgeht, wenn jemand verbunden ist.
Nachtrag... Habe es scheinbar gelöst
Code: Alles auswählen
#!/bin/bash
IPFILE=/home/Scripte/autodown/iplist.txt
if nmap -sP 192.168.22.0/24 | grep -f $IPFILE
then echo IP online; exit
else echo IP offline
fi
if netstat -t | grep ftp
then echo FTP online; exit
else echo FTP offline
fi
echo Alle offline, zeit für Shutdown
# shutdown -h now
-
rendegast
- Beiträge: 15041
- Registriert: 27.02.2006 16:50:33
- Lizenz eigener Beiträge: MIT Lizenz
Beitrag
von rendegast » 12.10.2011 21:51:34
Kann ich irgendwie noch abfragen, ob jemand per FTP verbunden ist ?
...
Ich habe Proftpd ...
ftpcount, ftpwho, ftpdctl ?
ftpdctl - ProFTPD control program
...
supporting actions like ... kicking FTP users, etc.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-
Huck Fin
- Beiträge: 1210
- Registriert: 10.03.2008 17:10:30
Beitrag
von Huck Fin » 12.10.2011 22:02:36
1000 Dank.
Die Befehle kannte ich noch nicht...
Nachtrag... Habe es scheinbar gelöst.
netstat -t | grep ftp