ubuntuusers.de

Endlosschleife in Bash

Status: Ungelöst | Ubuntu-Version: Ubuntu 10.04 (Lucid Lynx)
Antworten |

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: Zähle...

Danke für die Tips,

aber...

BlackHollow schrieb:

du kannst folgende Schreibweise verwenden

if [[ "$var_a" != "$var_b" ]]

Was bewirken die doppelten eckigen Klammern?

und zu gdialog: (meine ich jedenfalls)

gdialog --msgbox "IP has changed\!"

Warum soll das exclamation mark escaped werden?

Bloß fürs Verständnis, man will ja dazulernen 👍

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

kerrl schrieb:

... anschauen, wie die Abfrage über den Router aussieht, um unnötigen Traffic zu sparen.

Was für einen Router hast Du denn ?

Der Vorschlag von BlackHollow gilt wohl nur für D-Link Router (richtig ?)

Bei meiner Fritz Box ist z.B. die IP anders, und auch sonst ist es nicht ganz so einfach.
Aber dazu stehen hier im Blog einige Vorschläge: http://www.gimme-th.at/blog/?p=165

Lg,

track

BlackHollow

Anmeldungsdatum:
28. Juli 2009

Beiträge: 199

Ja, es ist ein D-Link Router...

[[ blablabla ]] ist eine weitere Möglichkeit neben [ ] und (( ))

Die Klammerung...

... (( )) dient zum Vergleichen von ganzen Zahlen (nur in Bash und Korn Shell)

... [[ ]] dient zum Zeichenketten und Mustervergleich. (nur in Bash und Korn Shell)

... [ ] dient nur zum Zeichenkettenvergleich.

Einige Zeichen müssen vor der Bash geschützt werden, damit sie nicht expandiert werden. Probiere in der bash:

gdialog --msgbox "IP has changed\!"

und

gdialog --msgbox "IP has changed!"

zweites sollte liefern:

bash: !": event not found

Anderes Beispiel wäre

gdialog --msgbox "\"Text in Anführungszeichen\""

John_W

Anmeldungsdatum:
10. Juli 2010

Beiträge: 571

Nutzt zwar einen externen Dienst, ist aber sehr flott und nutzt auch wenig Ressourcen:

dig +short @resolver1.opendns.com myip.opendns.com

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Wie kann dieses Skript bei Systemstart automatisch ausgeführt werden? Ich habe es in /usr/local/bin gespeichert und in der /etc/rc.local eingetragen. Trotzdem taucht es durch

ps ax|grep ip

nicht auf (das Skript heisst ipQuery.sh).

BlackHollow

Anmeldungsdatum:
28. Juli 2009

Beiträge: 199

Ich würde die in der crontab eintragen

Cron

crontab -e
@reboot /pfad/zu/skript.sh

BlackHollow

Anmeldungsdatum:
28. Juli 2009

Beiträge: 199

Vielleicht hast du auch einen Fehler in deinem Skript oder einen Fehler in rc.local gemacht

Ansonsten wird bei den Prozessen auch das verwendete Kommando und nicht der Skriptname angezeigt.

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

So schauts inzwischen aus:

#!/bin/bash

oldIP=senf#$(w3m checkip.dyndns.org | grep IP|cut -c 21-)
echo oldIP: $oldIP
sleep 5

while true; do

	newIP=$(w3m checkip.dyndns.org | grep IP|cut -c 21-)
	echo newIP: $newIP	

	if ! [ $oldIP = $newIP ]
		then
		gdialog --msgbox "IP has changed from $oldIP to $newIP"
	elif [ $oldIP = $newIP ]
		then
		echo Ip not changed
	fi

	oldIP=$newIP
	sleep 30
done

nullEuro

Avatar von nullEuro

Anmeldungsdatum:
26. Februar 2009

Beiträge: 225

Ich vermute es liegt daran, dass gdialog nicht weis auf welches display es Zeichnen soll. So sollte es gehen:

DISPLAY=:0.0 gdialog --msgbox "IP has changed from $oldIP to $newIP"

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Das Skript taucht noch nicht auf, auch nicht über den grafischen System Monitor (sollte ja das gleiche sein). Ist denn das Skript der eigentliche Prozess?

BlackHollow

Anmeldungsdatum:
28. Juli 2009

Beiträge: 199

Der Prozess ist das ausgeführte Kommando, nicht der Skritptname.

Wobei bei mir jetzt auch der Sriptname angezeigt wird 🙄

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

... also, erstmal würde ich mal grundsätzlich auf die Leerzeichen achten:

oldIP=senf#$(w3m checkip.dyndns.org | grep IP | cut -c 21-)
...
	newIP=$(w3m checkip.dyndns.org | grep IP | cut -c 21-)

- hier ist das vielleicht egal, aber sonst liefert das schon mal unerwartete Probleme.

Dann habe ich mal das Skript in einem echten Terminal gestartet ([Strg]-[Alt]-[F1]) und im Systemmonitor unter [Ansicht] "Alle Prozesse" eingeschaltet. Danach ist dein Skript bei mir so sichtbar:

Ungültiges Makro

Dieses Makro ist nicht verfügbar

Und dann ist da immer wieder das beliebte Problem, dass bei allem was im System-Kontext gestartet wird, die Umgebungsvariablen ja nicht gesetzt sind. Und eben auch nicht die Varible $PATH ... Wie soll da die arme bash Deine Befehle finden, wenn Du sie nicht mit vollständigem Pfad angibst ...?

Probier es mal so:

oldIP=senf#$(/usr/bin/w3m checkip.dyndns.org | /bin/grep IP | /usr/bin/cut -c 21-)
...

usw.

Das was nullEuro oben zu "Display" gesagt hat, solltest Du natürlich auch berücksichtigen.

track

Bilder

Blu2lz

Anmeldungsdatum:
10. Januar 2010

Beiträge: 538

Mein Thread wurde in diesem ja schon zitiert und ich bedanke mich für die Anregungen in diesem Thread!

Das Script läuft sehr schön, ich werde es nur die Tage auf meinen Netgear-Router anpassen, sodass ich nur intern abfrage, wie track und BlackHollow mir bereits rieten, um unnötigen Traffic zu vermeiden.

In Zeile 3 ist übrigens ein "senf" vor $ gerutscht...weiß nicht, wie das da reinkommt, aber es gehört da nicht hin. 😊

Ich werde meinen veränderten Quelltext dann hier als Ergänzung posten.

EDIT:

Mein Text ist nun fertig und funktioniert, ich poste ihn hier:

#!/bin/bash

oldIP=$(curl -s -u user:password http://192.168.0.1/RST_status.htm | sed -ne 74,74p | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
echo oldIP: $oldIP
sleep 5

while true; do

	newIP=$(curl -s -u user:password http://192.168.0.1/RST_status.htm | sed -ne 74,74p | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
	echo newIP: $newIP	

	if ! [ $oldIP = $newIP ]
		then
		DISPLAY=:0.0 gdialog --msgbox "IP has changed from $oldIP to $newIP"
	elif [ $oldIP = $newIP ]
		then
		echo Ip not changed
	fi

	oldIP=$newIP
	sleep 10
done

Dieses Script funktioniert für den Router DG834Gv5 von Netgear. Ihr müsst "user" und "password" jeweils mit euren Zugangsdaten für den Router ändern.

Mein Tipp für alle, die sich solch ein Script für ihren Router konfigurieren wollen: Öffnet die Seite, wo die IP in eurem Router steht und klickt rechts und auf Seitenquelltext anzeigen. Nun müsst ihr ein bisschen schauen, wo auf die Statusseite des Routers verlinkt wird und die html-Datei aufrufen. Diese müsst ihr hinter curl als Parameter angeben, bei mir jetzt RST_status.htm. In der html-Datei sucht euch den Part, wo eure IP steht und klickt sie an. Dann erscheint unten die Zeile. Das ersetzt ihr dann für die 74 hinter "sed". So könnt ihr für jeden Router ein Script erstellen.

@ BlackHollow:

Hätte da noch zwei kleine Fragen zur Syntax:

Wieso muss man hinter sed -ne 74,74p eingeben und nicht einfach nur 74p? Ich sehe nur, dass es nicht funktioniert, kann mir aber keinen Reim drauf machen...😛

Und während ich die zweite Frage schreiben wollte, stolperte ich über die Lösung...😛 Hatte den grep-Befehl nicht ganz verstanden, aber jetzt macht die {3} hinter \.) Sinn....😀

kerrl

(Themenstarter)
Avatar von kerrl

Anmeldungsdatum:
27. Januar 2009

Beiträge: 85

Der Initialwert der Variable ist bewusst abstrus, damit sich bei Funktionalität zwangsläufig der GDialog öffnet, da dann dieser Wert sofort und nicht erst bei neuer IP-Zuweisung geändert wird. Auch 'ne Debug-Art... Das sind halt die Bash-Spielereien.

In meiner Prozessliste steht weder 'cut' noch 'w3m'.

@Blu2lz: Danke für den Code!

Edit: Mein Skript scheint noch fehlerhaft zu sein. Häufig erscheint die Meldung "IP has changed from 123.456.78.9 to " (statt 123.456.78.9 steht da die tatsächliche ip...)

Blu2lz

Anmeldungsdatum:
10. Januar 2010

Beiträge: 538

In der Prozessliste erscheinen die aufgerufenen Prozesse ja auch nur in der Zeit, in der sie vom Script aufgerufen werden...Stell mal die Abhängigkeiten in der Systemüberwachung ein und lass das Script laufen. Unter dem Script erscheint dann sleep und für eine ganz kurze Zeit die Prozesse, wenn sie aufgerufen werden.

Wenn diese Anzeige bei dir noch kommt, scheint die Abfrage der NewIP ja irgendwie fehlzuschlagen. Welchen Router hast du denn?

Antworten |