[gelöst] DYNDNS per shellscript aktualisieren

level20peon

Mitglied
Mitglied seit
11 Jul 2007
Beiträge
270
Punkte für Reaktionen
0
Punkte
16
Hallo zusammen,


da ich nun schon stundenlang erfolglos ausprobiert habe, was ich versuche zu realisieren, frage ich einfach einmal nach. Laut Suche und Wiki müsste es funktionieren.

Ich versuche per scriptbefehl meine DYNDNS IP zu aktualisieren. Dies sollte eigentlich durch folgenden Befehl funktionieren:

Code:
wget -O - "http://USERNAME:[email protected]/nic/update?hostname=HOST.TEST.NU" | cat


Leider funktioniert dies aber nicht, der Fehler "Segmentation fault" wird ausgegeben. Ich habe den Ausdruck
Code:
http://USERNAME:[email protected]/nic/update?hostname=HOST.TEST.NU
im Browser erfolgreich testen können, die eingegebenen Daten scheinen somit nicht die Fehlerquelle zu sein.
Ich habe mir vor den Tests eine neue IP geholt, mein Account wurde also nicht wegen zu häufiger Aktualisierung gesperrt :D


Ich bin über jede Hilfe dankbar

-level20peon
 
Zuletzt bearbeitet:
Mit wget funktioniert es, wobei ich noch die Option -q einfügen würde, und das cat am Ende ist unnötig.
Also
Code:
wget -q -O - "http://USERNAME:[email protected]/nic/update?hostname=HOST.TEST.NU"
Wenn "Segmentation fault" kommt, stimmt etwas nicht mit Deinem wget.
 
Hallo Ralf,
bist du dir ganz sicher, dass in dem Kommando
wget -q -O - "http://...
das "-"-Zeichen mit nachfolgender Leerstelle richtig sind?
:verdaech:

Joe
 
RalfFriedl schrieb:
Mit wget funktioniert es, wobei ich noch die Option -q einfügen würde, und das cat am Ende ist unnötig.
Also
Code:
wget -q -O - "http://USERNAME:[email protected]/nic/update?hostname=HOST.TEST.NU"
Wenn "Segmentation fault" kommt, stimmt etwas nicht mit Deinem wget.

Funktioniert leider immer noch nicht, was kann denn an meinem "wget" nicht stimmen ?


Joe_57 schrieb:
Hallo Ralf,
bist du dir ganz sicher, dass in dem Kommando das "-"-Zeichen mit nachfolgender Leerstelle richtig sind?
:verdaech:

Joe

Das ist schon richtig so, dieses "-" gibt nur an, dass keine Ausgabe geschrieben werden soll, da "-O" normalerweise zb von "\var\test..." gefolgt wird, was eine Ausgabe an jener Adresse ergeben würde :D


-level20peon


EDIT: Der wget Befehl funktioniert unter dem BOFH-Linux unter VMWare, das ich für die Kompilierung des ds-mod nutze. Muss ich vielleicht bei der Konfiguration des ds-mod bei den BusyBox Optionen etwas auswählen (ar, diff, inetd, patch) oder sonst etwas Spezielles bei der Auswahl der Komponenten beachten ?
 
Zuletzt bearbeitet:
moin,

kurze frage, wofür brauchst du die funktion speziell? ich betreibe auf der fritz n webserver und der läuft auch seitdem stabil seit über 2 monaten die ip wird automatisch abgeglichen, allerdings macht das die fbox von zuhause aus.
 
Joe_57 schrieb:
bist du dir ganz sicher, dass in dem Kommando das "-"-Zeichen mit nachfolgender Leerstelle richtig sind?
Ja, erstens habe ich es ausprobiert, es funktioniert so.

Die Option -O gibt an, wohin die Ausgabe geschrieben werden soll. Normalerweise steht dort ein Dateiname. An dieser Stelle ist des der spezielle Dateiname "-" (kann man auch für die Shell mit Anführungszeichen Schreiben, stört nicht weiter). Die bedeutet, daß auf stdout geschrieben werden soll. Man könnte also auch -O "/dev/stdout" schreiben, nur geht das auf der Fritz Box nicht, weil /dev/stdout nicht existiert.

Mit dem wget von der Box bekomme ich zwar keinen "Segmentation fault", aber es geht trotzdem nicht. Das wget unterstützt anscheinend Benutzer:paßwort an dieser Stelle nicht richtig.

Andererseits hat die Box die Möglichkeit, DynDNS Updates selbst zu machen.
 
Juscho schrieb:
moin,

kurze frage, wofür brauchst du die funktion speziell? ich betreibe auf der fritz n webserver und der läuft auch seitdem stabil seit über 2 monaten die ip wird automatisch abgeglichen, allerdings macht das die fbox von zuhause aus.

Da DYNDNS accounts sperrt, wenn die IP sich bei updates nicht geändert hat benötige ich eine Möglichkeit, um periodisch die IP zu prüfen und dann gegebenenfalls ein update durchzuführen. Da ich sowieso per script periodisch auf eine Änderung der externen IP prüfe (siehe Signatur, 1und1 MOD) wäre es wenig elegant dies jetzt per extra client zu aktualisieren, wenn ich in der sowieso vorhandenen Abfrage einfach nur die "wget..." Zeile einfügen müsste.


RalfFriedl schrieb:
Mit dem wget von der Box bekomme ich zwar keinen "Segmentation fault", aber es geht trotzdem nicht. Das wget unterstützt anscheinend Benutzer:paßwort an dieser Stelle nicht richtig.

Wie gesagt, in der FriBoLi Umgebung funktioniert dieser Befehl, nun frage ich mich warum er in der IPPF Wiki so dokumentiert ist, da es dort ja um die FritzBox an sich geht, und nicht um "irgendeine" Shell mit der "nur" ein Mod kompiliert wird.


RalfFriedl schrieb:
Andererseits hat die Box die Möglichkeit, DynDNS Updates selbst zu machen.

siehe oben :D
Nur rein interessehalber: funktioniert dieser interne client überhaupt im ata-modus ?
 
Hallo,
gibt es schon einen Lösungsansatz zu wget Fehler?
Habe von ds-mod 14.4 auf 15.1 geupdatet und jetzt funktioniert mein:
Code:
wget -q -O - "....
nicht mehr und gibt auch ein "Segmentation fault" zurück.
Compiliert hab ich mit FRIBOLI und das Script funktionierte mit 14.4 noch ohne Probleme..
Grüße
bart99
 
level20peon schrieb:
Da DYNDNS accounts sperrt, wenn die IP sich bei updates nicht geändert hat
DynDNS biete auch "Static DNS Hosts" an - hier wird der Account nicht gesperrt, wenn sich die IP nicht regelmäßig ändert. Wenn sie sich aber mal ändert, wird sie auch aktualisiert.

level20peon schrieb:
Nur rein interessehalber: funktioniert dieser interne client überhaupt im ata-modus ?
Bei mir (7170 im "Lan-A-Modus" mit quasi-statischer IP, ca 1 IP-Wechsel alle 2 Monate) ja.


Gruß,
Wichard
 
@Bart99
Mach doch bitte im dsmod-Unterforum einen Thread mit dem wget Problem auf. Sonst vergess ich das wieder...

MfG Oliver
 
Na prima, dann kann ich endlich wieder ruhig schlafen :D

EDIT: Nun da das Problem gelöst ist könnt ihr das Topic entsprechend markieren :cool:
 
Zuletzt bearbeitet:
Meine Fritzbox hängt als Client im Netz und updated immer Dyndns immer fleissig mit dessen lokalen IP. Super! :mad:

Auch wenn der Thread hier etwas älter ist. Es war der einzige, der bei meiner Suche aufgetaucht ist. Hier meine Lösung als shell Skript für die 7170:

EDITIERT:
Code:
#!/bin/sh                                                                                                                        
update_ip="http://whatismyip.org"                                                                                               
#update_ip="http://aufderpalme.au.funpic.de/ip/" #alternative for testing (gives back ip, but without limit, only 4 testing, please)              
update_interval=60                                                                                                               
u_name=##ddns-name##                                                                        
u_pass=##ddns-pw##                                                                                                
ddns_url=##ddns_url, z.B. mustermann.dnsalias.com##                                                                                        

                                                                                                                                 
doOnUpdate() {                                                                                                                   
        eventadd 1 "neue externe IP-Adresse: $new_ip"                                                                            
        secret_url="http://$u_name:[email protected]/nic/update?hostname=$ddns_url&myip=$new_ip"                        
        ddns_result="$(wget -q -O - $secret_url)"                                                                                
        eventadd 1 "Update DDNS: $ddns_result"                                                                                   
        if [ $ddns_result != "good $new_ip" ] ; then                                                                                     
        # if error occured:                                                                                                      
                eventadd 1 "Update DDNS failed: next try in 60 min -> http://www.dyndns.com/developers/specs/return.html"        
                sleep 3600                                                                                                       
        fi                                                                                                                       
        sleep 60                                                                                                                 
        return                                                                                                                   
}                                                                                                                                
                                                                                                                                 
                                                                                                                                 
sleep 60                                                                                                                         
{                                                                                                                                
        new_ip="$(wget -q -O - $update_ip)"                                                                                      
#       old_ip="$new_ip"  #uncomment for not updating on start                                                                   
        while true; do                                                                                                           
                if [ "$old_ip" != "$new_ip" ] ; then                                        
                        doOnUpdate                                                                                               
                fi                                                                                                               
                sleep $update_interval                                                                                           
                old_ip="$new_ip"                                                                                                 
                new_ip="$(wget -q -O - $update_ip)"                                                                              
        done                                                                                                                     
}&

Das Skript ist eine Modifizierung von http://www.ip-phone-forum.de/showthread.php?t=143149.
Es überprüft jede Minute (oben einstellbar), ob sich die IP geändert hat und führt dann die funktion doOnUpdate aus. Ebenso beim Skriptstart (falls die Zeile #old_ip=.... nicht auskommentiert wird. Im Eventlog wird dann die Aktion eingetragen.

Die URL kann natürlich auch für alle anderen DDNS-Dienste angepasst werden, die per url geupdated werden können. Weitere Aktionen können natürlich auch hier eingefügt werden (z.B. OVPN/VOIP-restarts,...).


UPDATE 28.05.2009
Da mir kurzzeitig mein DDNS Account gesperrt wurde, habe ich das Skript noch etwas modifiziert. Ich weiss nicht genau, wiso, aber die IP wurde wohl zu oft geupdated (warum auch immer...).

Das Skript vergleicht nun die externe ddns-Addresse mit der aktuellen und ändert diese nur, wenn sie sich tatsächlich unterscheiden. Mehrfaches Ausführen des Skripts oder zuviele Neustarts führen so zu keinem unnötigen (illegitimen) Updates.

Code:
#!/bin/sh
################################
# Updates dyndns.com
# HHAW
# V.1.1
################################

update_interval=60
u_name=NAME
u_pass=PASS
ddns_url=SERVER.dnsalias.com  #, z.B. mustermann.dnsalias.com##

################################
getExternalIp(){
################################
        externalIp=$(wget -q -O - http://checkip.dyndns.com|sed -n "s/.*: //;s/<.*//;p")
}



################################
getDdnsIp(){
################################
	ddnsIp=`ping -c 1 -s 1 -w 1 $ddns_url|sed -n "s/).*//;s/.*(//p"`
}



################################
logDebugEvent(){
################################
# zur Fehlersuche
#       echo `date` "$*" >> /var/tmp/ddns.log
	#dummy, falls  echo auskommentiert:
 sleep 1&
}



################################
logEvent(){
################################
       logDebugEvent "$*"
       eventadd 1 "$*"
}


################################
doOnUpdate() {
################################
	logEvent "neue externe IP-Adresse: $new_ip"
	
	#restart VOIP daemon
        voipd -R
    ## Put here whatever you want to do ....
        
        #update DDNS-adress
        secret_url="http://$u_name:[email protected]/nic/update?hostname=$ddns_url&myip=$new_ip"
	logDebugEvent $secret_url 
        ddns_result="$(wget -q -O - $secret_url)"
        logEvent "Update Result DDNS: $ddns_result"
        if [ "$ddns_result" != "good $new_ip" ] ; then
        # if error occured:
                logEvent "ERROR: Update DDNS failed: next try in 60 min -> http://www.dyndns.com/developers/specs/return.html"
                sleep 3600
        fi
        return
}




################################
# MAIN
################################
{
	while true; do
		
		#get current ddns-ip
		getDdnsIp
		old_ip=$ddnsIp
		logDebugEvent "ddns: $old_ip"
		
		#get current external IP
		getExternalIp
		new_ip=$externalIp
		logDebugEvent "new_ip: $new_ip"
		
		if [ "$old_ip" != "$new_ip" ] ; then
			doOnUpdate
		fi
		
		sleep $update_interval

	done
}
 
Zuletzt bearbeitet:
@risaer: Ein paar Hinweise zu deinem Script:

Warum definierst du username, password usw als Variable ? Die kommen doch in jedem Fall eh nur einmal im Script vor, also kannst du kostbare Buchstaben sparen, indem du sie direkt an der entsprechenden Stelle einfügst :D


Code:
if " $ddns_result != "good" ] ; then

wird nicht mehr funktionieren, da das Ergebnis im Fall eines Updates "good 66.66.66.66" lautet.
 
@risaer: Ein paar Hinweise zu deinem Script:

Warum definierst du username, password usw als Variable ? Die kommen doch in jedem Fall eh nur einmal im Script vor, also kannst du kostbare Buchstaben sparen, indem du sie direkt an der entsprechenden Stelle einfügst :D

Hmm. kostbare Buchstaben? Da nehm ich doch der Übersicht wegen lieber ein paar Buchstaben und Zeilen mehr. Auf die 30 Zeichen kommts ja wohl den meisten nich an, oder? :)

Code:
if " $ddns_result != "good" ] ; then

wird nicht mehr funktionieren, da das Ergebnis im Fall eines Updates "good 66.66.66.66" lautet.
OK. Das stimmt wohl ;) . Ich denke, dies sollte dann so funzen:
Code:
if [ $ddns_result != "good $new_ip" ] ; then
 
Hi

Das Script ist noch unvollständig: Wenn sich die IP-Adresse NICHT ändert (üblich bei Kablemodem oder in der Schweiz VDSL) muss der Client nach spätestens 28 Tagen trotzdem ein update machen. Zumindest bei DynDNS wird der Eintrag sonst deaktiviert.

Hier gibt es sowas für die NSLU2, sollte einfach zu adaptieren sein:

http://www.nslu2-linux.org/wiki/HowTo/DynDNSupdate

Dort sieht man auch schön die Entwicklung, nur sind die schon weiter als wir ;-)

Grüsse

Psychodad
 
Was heißt denn "die sind weiter"... es geht darum eine dynamische Addresse zu aktualisieren, nicht das Rad neu zu erfinden. Und das funktioniert mit den hier geposteten scripten sehr gut.

Das Problem mit den 28 Tagen ist wohl aber keine Sache, die man 1 zu 1 von NSLU2 kopieren kann. Die dort vorgestellten Lösungen gehen davon aus, dass der client (sprich: hier die Fritzbox) ununterbrochen ohne reboot läuft. Sollte man sie einmal rebooten (sei es um die Firmware zu flashen, oder warum auch immer) wird der entsprechende timer wieder auf 0 gesetzt.

Wenn es möglich wär einen online-lookup zu machen, der zurück gibt, seit wann eine DNS-Adresse vergeben ist wär es jedoch kein Problem. Ich konnte einen solchen Service jedoch nicht finden (jedoch heißt das nicht, dass es keinen geben kann).
Eine andere, näherliegende Möglichkeit wäre eine entsprechende Information einfach auf einen nicht-flüchtigen Speicher auszulagern. Man könnte bei einem update einfach eine Datei mit entweder Inhalt oder Name des update-Datums(/Uhrzeit) auf ein an die Fritzbox angeschlossenes Medium (USB-Stick), oder Netzwerkressource / FTP / was auch immer speichern, die in der Abfrage dann berücksichtigt wird.

Braucht das hier denn überhaupt jemand ;) ?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.