have problems with a shell script

Discuss anything not related to mms

Moderator: Moderator

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

have problems with a shell script

Postby parti02 » Thu Dec 18, 2008 6:28 pm

Hi all,
perhaps can somebody help.
I have a Fritz Box router running on my network, the idea is to start automatically a server when a network request is sending to it.
The PC should start, when i start my media center and media files are needed and when i connect from outside, to use ftp,htp, ssh etc.

The funtions itself are running, but i am not able to write a running script and combine the functions automatically.
The FritzBox contains a bussy box, so perhaps some bash functions are not available.
I know, when i want, that the server is gooing to sleep for a few minutes, i haven't to use standard ports.

Code: Select all

# /bin/sh
# Automatic starting system on network request
#
# Version 1.0, by Parti
#

# Configure MAC
wolmac="00:19:66:39:11:61"
wolinterface="lan"

# Configure IP
ip="192.168.178.35"

# Time for booting in s
boottime="10"

# Minimum runtime in s
runtime="900"

if (! ls /var/tmp/tcpdump 2>/dev/null); then
  echo tcpdump not found in /var/tmp
  exit 0
fi

/var/tmp/tcpdump -n -t -l dst host "$ip and (port 200 and 201)" > /var/tmp/dump.log &

fstread= ls -t -l -e /var/tmp/dump.log

while true; do
  (
  sndread= ls -t -l -e /var/tmp/dump.log
  if ( "$fstread" != "$sndread" ); then
    echo ether-wake -i $wolinterface $wolmac
  fi
  echo Waiting "$boottime" seconds. Computer is starting...
  sleep $boottime
  if ( ping -c 4 $ip); then
    echo Computer successfully started. Waiting $runtime seconds.
    sleep $runtime
    fstread= ls -t -l -e /var/tmp/dump.log
  fi
  )
done


The idea is simple, tcpdump is watching on a choosen ip and port, when a request is incomming, it write the request in the "dump.log".
ls reads the modification time from the dump.log, 1st and 2nd time. When 1st and 2nd time are different, a request was send.
Etherwake is sending a wol package and wait a little bit for booting the server. After a successfully ping is sended the script is sleeping
during the minimum runtime of the server. At last it would realy great, if the file size of dump.log is to big, stop tcpdump, delete the dump.log
and start tcpdump again.

Now i get a "permission denied" when running the script.

Perhaps, you can see, i never write a shell script before :D
Thx a lot.

Gruß
Dirk

User avatar
magicamun
master
Posts: 688
Joined: Thu Feb 28, 2008 7:42 am
Location: Germany

Re: have problems with a shell script

Postby magicamun » Thu Dec 18, 2008 8:51 pm

Hi - sei mir nicht bös - aber ich hab nicht viel verstanden, ausser das du einen Server aufwecken willst oder?

permission denied ist entweder kein Recht das Script auszuführen - zu beheben mittels chmod +x scriptname oder aber teile des scripts wollen in Dateien/Verzeichnisse schreiben und dürfen nicht.

/var/tmp ist kein Ablageort für executeables - es ist ein ablageort für temporäre Dateien. Schreib nochmal was du willst und dann sehen wir weiter - iss nicht schwer.

Wozu brauchst du tcpdump?

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Fri Dec 19, 2008 3:39 pm

in deutsch wird es mir auch leichter fallen :D
Ich möchte gerne einen Server laufen haben, welcher mir als zentraler Speicherort für meine Dateien dient, der Server soll natürlich zur Verfügung stehen, wenn ich mein Multimedia-Center im Wohnzimmer starte und auch, wenn ich von außerhalb auf ihn zugreife (ftp,http,ssh usw). Jetzt soll der Server aber nicht an 365 Tagen im Jahr laufen, und jedesmal hinlaufen und ihn einschalten wenn ich was brauche, möchte ich auch nicht, zumal es von außerhalb auch nicht möglich ist.

Betreibe mein Netzwerk hier mit einer Fritzbox, welche immer an ist, auch wenn die Möglichkeiten damit natürlich begrenzt sind, aber etherwake ist von Haus aus installiert und tcpdump konnte ich einfach raufkopieren und es lief, damit sollte alles nötige vorhanden sein.

ls -t -l -e /var/tmp/dump.log
zeigt mir die Datei dump.log und das Datum der letzten Veränderung. Den Rückgabewert von ls speichere ich mir am Anfang des Scriptes in eine Variable, um einen Ausgangspunkt zu haben.

/var/tmp/tcpdump -n -t -l dst host 192.168.178.33 "and (port 200 and 201)" > /var/tmp/dump.log &
schreibt für jedes Paket welches an o.g. IP und o.g. Port geht einen Eintrag in die dump.log, d.h. die Größe der Datei als auch das Datum der letzten Veränderung ändern sich, wenn ein request an meinen Server gesendet wird.

wenn ich jetzt erneut ls mit o.g. Parametern aufrufe und den Rückgabewert wieder in einer Variable speichere, und diese dann miteinander vergleiche
kann ich feststellen ob es einen Request gegeben hat oder nicht. Falls es einen Request gab, soll etherwake ein WOL Packet senden, und das Script sich
für eine Zeit X (Bootime des PCs) schlafen legen, wenn die Zeit verstrichen ist, soll ein Ping gesendet werden, wenn der Ping erfolgreich ist, soll das Script für eine Zeit X (solange ist der PC mindestens an bevor er sich wieder abschaltet) schlafen.
Ist die Zeit X verstrichen, wird wieder ls -t -l -e /var/tmp/dump.log ausgeführt um einen neuen Ausgangspunkt zu haben und das Script läuft von vorne.
Wenn der Ping natürlich nicht erfolgreich war, soll ein neues WOL Paket gesendet werden.

Jetzt wäre natürlich noch super, wenn man ab und an mal prüfen könnte, wie groß die dump.log geworden ist, falls sie zu groß ist wird sie gelöscht, oder auch die Größe 0 byte gesetzt. Vieleicht würde ein Neustart von tcpdump das auch schon erledigen.

Ich glaube das hört sich schon recht kompliziert an :D Vieleicht denke ich aber auch nur so kompliziert, wenn du eine einfachere Lösung kennst dann immer her damit.
Vielen Dank schon mal für deine Hilfe.

chmod +x habe ich schon versucht, leider ohne Erfolg, es gibt auf der FritzBox nur einen Benutzer und das ist root, denke mal der Fehler ist im Script.
/var/tmp ist natürlich nicht der perfekte Speicherort für sowas, aber die FritzBox ist in manchen Verzeichnissen etwas zickig was das Schreiben angeht, um dem ganzen aus dem Weg zu gehen habe ich zum testen erstmal /var/tmp/ gewählt, wenn alles läuft werde ich bestimmt noch ein nettes Plätzchen finden.

Gruß
Dirk

LivingOn
Posts: 64
Joined: Sat Dec 06, 2008 2:19 pm

Re: have problems with a shell script

Postby LivingOn » Sat Dec 20, 2008 8:57 am

Hallo parti02,

hier mal eine etwas kürzere Version des Scripts (ungetestet!)

Code: Select all

#!/bin/sh

ip="192.168.178.35"
wolmac="00:19:66:39:11:61"
wolinterface="lan"

while true; do
   
        # wartet solange bis das erste Paket aufläuft und beendet
        # sich dann
        tcpdump -c1 dst host "$ip and (port 200 and 201) &>/dev/null

        # schickt den Weckruf ins Netz
        ether-wake -i $wolinterface $wolmac

        # legt sich dann 5 Minuten schlafen
        sleep 300
done


Gruss
LivingOn

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Sat Dec 20, 2008 11:08 am

Das sieht natürlich etwas übersichtlicher aus :D
Bin erst morgen Mittag wieder @home, werde es denn gleich testen.
Nachdem das Script 5 min geschlafen hat, startet tcpdump erneut?

Gruß
Dirk

LivingOn
Posts: 64
Joined: Sat Dec 06, 2008 2:19 pm

Re: have problems with a shell script

Postby LivingOn » Sat Dec 20, 2008 1:50 pm

parti02 wrote:Nachdem das Script 5 min geschlafen hat, startet tcpdump erneut?


jup - die 5 Minuten sind allerdings nur ein Beispiel ;-)

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Sun Dec 21, 2008 2:25 pm

Code: Select all

#!/bin/sh

ip="192.168.178.35"
wolmac="00:19:66:39:11:61"
wolinterface="lan"
time=3

while true; do
  /var/tmp/tcpdump -c 1 -n -l arp dst host $ip
  ether-wake -i $wolinterface $wolmac
  echo WOL package send
  echo waiting $time
  sleep $time
done


so läuft es, leider bringt das zuvor angehängte &>/dev/null hinter tcpdump, das script irgenwie aus dem Tritt, es wird ein WOL Packet gesendet, dann die Zeit abgewartet und anschließend wieder tcpdump gestartet usw., bevor überhaupt das erste Packet bei tcpdump eingetroffen ist.
Würde natürlich trotzdem gerne das Script zum schweigen bringen, es sollen nur die echos angezeigt werden. Ist es möglich zu Prüfen ob z.B. tcpdump tatsächlich gestartet wurde, um anschließend ein "echo tcpdump is running auszugeben"?

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Sun Dec 21, 2008 3:29 pm

eventadd 1 "text"
trägt ein Systemereignis direkt auf der Weboberfläche der Fritz Box ein, das ist genau was ich möchte.
Also müsste das ganze Script "stumm" sein.
Man müsste nur festellen ob tcpdump wirklich läuft und dann ein eventadd ausführen, gleiches gilt für ether-wake.
Ist das machbar?

Gruß
Parti

LivingOn
Posts: 64
Joined: Sat Dec 06, 2008 2:19 pm

Re: have problems with a shell script

Postby LivingOn » Sun Dec 21, 2008 4:54 pm

Hallo parti02,

parti02 wrote:eventadd 1 "text"
trägt ein Systemereignis direkt auf der Weboberfläche der Fritz Box ein, das ist genau was ich möchte.
Also müsste das ganze Script "stumm" sein.
Man müsste nur festellen ob tcpdump wirklich läuft und dann ein eventadd ausführen, gleiches gilt für ether-wake.
Ist das machbar?

Gruß
Parti


Schau Dir mal pidof an ;-)

Code: Select all

if pidof tcpdump; then
   echo "jo, läuft"
else
   echo "nee, läuft nicht"
fi


Gruss
LivingOn

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Sun Dec 21, 2008 6:33 pm

Code: Select all

#!/bin/sh

ip="192.168.178.35"
wolmac="00:19:66:39:11:61"
wolinterface="lan"
time=3

while true; do
  /var/tmp/tcpdump -c 1 -n -l arp dst host $ip &>/dev/null
  if pidof tcpdump; then
    eventadd 1 "tcpdump is running"
  else
    ether-wake -i $wolinterface $wolmac
    if pidof ether-wake; then
      eventadd 1 "WOL package was send to $wolmac on $wolinterface"
      eventadd 1 "waiting for $time seconds"
      sleep $time
    fi
  fi
done


so wird tcpdump andauernd neu gestartet, bis die FritzBox abstürtzt, :D wenn ich das & wegnehme wird die IF natürlich erst ausgeführt wenn tcpdump beendet ist.

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Mon Dec 22, 2008 11:39 am

so scheint es zu laufen, ein kleiner Schönheitsfehler ist noch drin.
Kann ich in einer IF nicht auch sagen, er soll gar nichts tun, das echo in der ersten IF finde ich halt nicht so schön.
Vielen vielen Dank für eure Hilfe.

Code: Select all

#!/bin/sh

ip="192.168.178.35"
wolmac="00:19:66:39:11:61"
wolinterface="lan"
time=5

while true; do
  if test -x /var/tmp/tcpdump ; then
   echo
  else
    eventadd 1 "WakeUp-Script: Tcpdump nicht gefunden. Script beendet."
    break 2
  fi
  eventadd 1 "WakeUp-Script: Tcpdump ueberwacht $ip"
  /var/tmp/tcpdump -p -c 1 -n -l arp dst host $ip >/dev/null
  if test -x /usr/bin/ether-wake ; then
    ether-wake -i $wolinterface $wolmac
    eventadd 1 "WakeUp-Script: WOL Packet an $wolmac und Adapter: $wolinterface gesendet"
    eventadd 1 "WakeUp-Script: wartet $time"
    sleep $time
  else
    eventadd 1 "WakeUp-Script: Ether-wake nicht gefunden. Script beendet."
    break 2
  fi
done


Gruß
Dirk

User avatar
Uatschitchun
Overlord
Posts: 3189
Joined: Tue Dec 06, 2005 6:55 pm
Location: Germany
Contact:

Re: have problems with a shell script

Postby Uatschitchun » Mon Dec 22, 2008 1:09 pm

Man kann in einer IF auch auf ein false prüfen, im Sinne von: Wenn nicht, dann
Lg
Roman

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Mon Dec 22, 2008 7:11 pm

Das habe ich auch versucht, nur leider die Syntax nicht hinbekommen. Mit [] scheint in der busybox nicht zu funktionieren.

Gruß
Dirk

LivingOn
Posts: 64
Joined: Sat Dec 06, 2008 2:19 pm

Re: have problems with a shell script

Postby LivingOn » Tue Dec 23, 2008 8:18 am

Hallo parti02,
parti02 wrote:Das habe ich auch versucht, nur leider die Syntax nicht hinbekommen. Mit [] scheint in der busybox nicht zu funktionieren.


versuch es mal so ;-)

Code: Select all

if [ ! -x /var/tmp/tcpdump ]; then

Wichtig hierbei sind die Leerzeichen hinter [ und vor ]

parti02
veteran
Posts: 232
Joined: Sat Jun 16, 2007 5:52 pm

Re: have problems with a shell script

Postby parti02 » Fri Dec 26, 2008 10:57 am

ok läuft, weiß leider nicht warum es bei mir vorher nicht geklappt hat.
Thx.

Gruß
Dirk


Return to “Off-topic”

Who is online

Users browsing this forum: No registered users and 1 guest