Seit kurzer Zeit muss man sich, damit man seinen Hostnamen nicht verliert, jeden Monat im Account von DynDNS.org einloggen. Mit einem einfachen Skript und einem Crontab Eintrag lässt sich das automatisieren.
Automatisch einloggen
Folgendes Skript automatisiert das Login im Account von DynDNS.org. Man muss nur noch den Usernamen und das Passwort eintragen.
########################################################################
#
# dyndnslogin
# Automate login to prevent account expiration
#
########################################################################
########################################################################
# DynDNS Settings (default-value, overwrite with $1 and $2)
DEFAULT_USERNAME=”username”
DEFAULT_PASSWORD=”password”
# Import settings from /etc/ddclient.conf if available
DDCONF=”/etc/ddclient.conf”
if [ -r “$DDCONF” ] && grep -q “^server=members.dyndns.org” “$DDCONF”
then
DEFAULT_USERNAME=”`awk -F= ‘/^login=/{ print $2 }’ $DDCONF`”
DEFAULT_PASSWORD=”`awk -F= ‘/^password=/{ print $2 }’ $DDCONF`”
fi
########################################################################
# Variabeln
USERNAME=${1:-$DEFAULT_USERNAME}
PASSWORD=${2:-$DEFAULT_PASSWORD}
PROGNAME=”dyndnslogin”
COOKIE=”`mktemp –tmpdir=”/tmp” -t ${PROGNAME}_cookie_XXXXX`”
OUTPUT=”`mktemp –tmpdir=”/tmp” -t ${PROGNAME}_output_XXXXX`”
USERAGENT=”Mozilla/5.0″
########################################################################
# Main
MULTIFORM=`curl -s -A $USERAGENT -c $COOKIE https://account.dyn.com \
| awk -F\’ ‘/multiform/{ print $6 }’`
curl -s –location -A “$USERAGENT” -b “$COOKIE” -c “$COOKIE” -o “$OUTPUT” \
–data “username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM” \
https://account.dyn.com/
if grep -q -i -E “(Welcome|Hi).*$USERNAME” “$OUTPUT”
then
echo “Login successful”
else
echo “Login failed”
FAILED=”true”
fi
rm “$COOKIE”
rm “$OUTPUT”
then
exit 1
fi
Nach dem Ausführen erhält man die Rückmeldung, ob das Login funktioniert hat oder nicht.
Dieser Code gibt es auch in meinem Scripts Git Repository: https://raw.github.com/emanuelduss/Scripts/master/dyndnslogin.
Automatisieren
Mit crontab -e bearbeitet man die Crontab und fügt dort folgende Zeile ein:
Somit wird an jedem Sonntag um 23:05h ein Login im DynDNS.org Account gemacht.
Links und weitere Informationen
- Git Repository Scripts: https://github.com/emanuelduss/Scripts
- DynDNS Account Login: https://account.dyn.com/
- DnyDNS Service Level Agreement: http://www.dyndns.com/about/legal/sla.html
Hallo,
wo wird das Script für DYNDNS eigentlich eingebaut ? Z.B bei Freetz.
Der Crontab is klar.
Gruß Achim
Hallo Achim
Was meinst du mit “wo”?
Das Skript speichert man auf einem im Netzwerk aktivem Rechner (Server o.ä.) und ruft es regelmässig auf (mittels cronjob). Somit wird am im Account eingeloggt und der reservierte Hostname bleibt bestehen.
Konnte ich helfen?
GRZ
Emanuel
Hi there,
I found this script / site via Google. I’m also having the new DynDNS requirement for free users and I would like to use a script like this to automatically login.
However, I don’t know how to use the script yet. I’m running a Windows 2003 server. How do I execute this script? Can you explain please?
Thanks!
Hello Maarten
This is a Bash-Script, which means you need a Linux/Unix Box to run this script. It’s not supported by Windows.
Greetings
Emanuel
You’ll be able to run the script under Windows.
You have to install cygwin first. Then use this wrapper script: https://gist.github.com/marcells/5810096
Hello Marcell
Wow! That’s nice. Thanks for testing and the tiny wrapper script for windows.
Emanuel
Hallo, habe versucht das Script auf einer Fritz/FreetzBox laufen zu lassen.
Ausgabe:
: not foundxxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 7:
: not foundxxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 12:
/xxx/xxxxx/xxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 16: mktemp: not found
/xxx/xxxxx/xxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 17: mktemp: not found
: not foundxxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 19:
: not foundxxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 22:
/xx/xxxxx/xxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 2: syntax error: unexpec
ed “|”
Was kann man tun, um es anzupassen?
Danke
Hallo Hasenstolz
In der ersten Zeile kann noch der Shebang eingefügt werden:
bzw.
(je nach Shell. Verfügbare Shells anzeigbar mit chsh -l)
Zudem ist mktemp nicht vorhanden. Die temporären Files kann man auch durch statische Files ersetzen:
OUTPUT=/tmp/dyndnslogin_output
Zudem ist curl (wäre ersetzbar durch wget), awk und grep nötig, damit das Skript funktioniert. Ich weiss nicht, ob das auf der FritzBox vorhanden ist.
Hat es geklappt?
Gruss
Emanuel
Danke erst mal! Wget ist vorhanden. Wie würde das dann aussehen? Bitte etwas konkrter. Mit der Programmierung von Unix-Scripten bin ich nicht so vertraut.
Nochmal herzlichen Dank für die superschnelle Antwort. Das Thema dürfte eine ganze Gemeinde von Leuten aus dem DEB interessieren.
Hallo Hasenstolz
Man muss wget dazu bringen, cookies zu speichern und wieder auszulesen, sowie die Session zu behalten. Das würde etwa so klappen (Ich habe das jetzt aber nicht getestet):
Ich weiss zwar nicht was die DEB ist, aber schön, dass es jemand interessiert 😉
Wie führst Du das Script aus? warum heisst es dort “not foundftp” Hast Du zugriff auf eine Shell?
Gruss
Emanuel
Genau was ich gesucht habe das Script .. Danke 🙂
Momentan läuft es auf einem Raspberry … ich würde es aber lieber auf meiner Firewall laufen lassen … die ist immer an.
Ich hab dort aber nur wget und kein curl …
Leider bin bekomme ich es nicht hin … curl einfach durch wget zu ersetzen geht nicht.
Und in Bash bin ich nicht fit.
Aber wenn nicht muss es halt auf dem Raspi weiter laufen …
Gruß,
Thomas
Hallo Thomas
Bitte 🙂
Vielleicht gibt es irgendwo curl für die Firewall?
Beim Ersetzen von curl durch wget kann man nicht einfach den Befehl austauschen, sondern auch die Optionen anpassen. Wichtig ist, dass Cookies gesetzt werden (da hilft vl. die Option “–save-cookies” bzw. “–load-cookies”). Habs aber selber nie probiert.
Da das aber nur einmal pro Monat ausgeführt werden muss, muss das Raspberry ja nicht den ganzen Monat laufen, sondern nur einmal im Monat 😉
Gruss
Emanuel
: not foundftp/xxxxx/xxxxx/scripts/dynlogin.sh: line 1:
+ USERNAME=xxxx
+ PASSWORD=xxxx
+
: not foundftp/xxxxx/xxxxx/scripts/dynlogin.sh: line 1:
+ PROGNAME=dyndnslogin
+ COOKIE=/tmp/dyndnslogin_cookie
+ OUTPUT=/tmp/dyndnslogin_output
+ USERAGENT=Mozilla/5.0
+
: not foundftp/xxxxx/xxxxx/scripts/dynlogin.sh: line 1:
+
: not foundftp/xxxxx/xxxxx/scripts/dynlogin.sh: line 1:
/xxx/xxxx/xxx/xxxxx/xxxxx/scripts/dynlogin.sh: line 2: syntax error: unexpect
ed “|”
Sieht ein weinig besser aus….
Manchmal wird man statt mit “Welcome” auch mit “Hi” begrüßt.
Daher habe ich die Erfolgsüberprüfung etwas modifiziert (:
B=`grep -E "<span>Hi.*$USERNAME" $OUTPUT|wc -l`
if [ $A -gt 0 -o $B -gt 0 ]
then
echo Login successful
else
echo Login failed
FAILED="true"
fi
Gruss, Schlaubi
Hallo Schlaubi
Danke für den Hinweis. Das kann man auch direkt auf einmal überprüfen:
Ich habe es in den Code aufgenommen. Thx.
Gruss
Emanuel
Funktioniert es noch bei euch? Ich bin heute auf diese Webseite gestoßen – erstmal vielen herzlichen Dank an dich Emanuel für das Skript. Ich bekomme leiderlei Fehlermeldungen, das Skript läuft sauber durch, jedoch habe ich immer ein LOGIN FAILED 🙁
Ich habe sehr viele Sonderzeichen im Passwort – kann das ein Problem sein bzw. hat Dyn etwas an Ihrer URL-Syntax geändert dass es seit evtl. einigen Tage nicht mehr geht? Kann das jemand bitte mal mit seinem Skript prüfen?
Danke.
Hallo Ribba
Danke. Bei mir funktioniert es noch wunderbar. Die URL und das Formular haben sich als nicht geändert.
Problematische Sonderzeichen in diesem Fall könnten Leerzeichen, #, %, & und ‘ sein. Probier es doch mal mit einem anderen Passwort. Das sollte gehen.
Gruss
Emanuel
Hallo Ribba,
habe folgendes gemacht, um mit Sonderzeichen im Passwort zu arbeiten. Seit curl > 7.18.0 gibt es die Option –data-urlencode und dann muss das so ausschauen:
-d username=$USERNAME --data-urlencode password=$PASSWORD -d "iov_id=&submit=Log+in&multiform=$MULTIFORM" \
https://account.dyn.com/
Funktioniert bei mir auf einer pfSense 2.1 wunderbar. Musste nur das curl package nachinstallieren und mktemp aus dem Script entfernen.
“keinerlei” sollte das eigentlich heißen… 😉
Hi Emanuel,
habe das Problem gefunden:
Ich habe den curl einfach mal zum Test nicht im Silent (-s) laufen lassen und bekomme eine Fehlermeldung bzgl. HTTPS/SSL:
curl: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
curl performs SSL certificate verification by default, using a “bundle”
of Certificate Authority (CA) public keys (CA certs). If the default
bundle file isn’t adequate, you can specify an alternate file
using the –cacert option.
If this HTTPS server uses a certificate signed by a CA represented in
the bundle, the certificate verification probably failed due to a
problem with the certificate (it might be expired, or the name might
not match the domain name in the URL).
If you’d like to turn off curl’s verification of the certificate, use
the -k (or –insecure) option.
Also einfach -k (für Insecure) dazugebaut und schon geht es. Ich wundere mich aber sehr wie es bei euch ohne gehen kann, denn das Skript connectet bei euch ja auch auf https://
Hast du vielleicht eine Erklärung dafür bzw. vllt müsstest du das noch in den Skript aufnehmen?
Gruß Ribba
Hallo Ribba
Da bei mir der Fehler nicht kommt, hast Du warscheinlich das nötige Zertifikat nicht installiert. Mit `openssl version -d` kann man den Ordner anzeigen, der nach Zertifikaten durchsucht wird. Bei mir unter Arch Linux ist es `/etc/ssl/`. Was hast Du für eine Distribution?
Ich sehe mit `curl -v https://dyn.com`, dass dieses CA File verwendet wird: /etc/ssl/certs/ca-certificates.crt. Das Zertifikat wurde von digicert.com ausgestellt. Zeigt dein Browser auch ein Fehler an?
Viel Erfolg und Gruss
Emanuel
Ich hab dein Skript auf einer Firewall im Einsatz die auf OpenSuse basiert. Hier sind keine Zertifikate vorhanden in dem Ordner und das ist dann das Problem. Okay dann ist das eher optional für alle Leute die versuchen das auf irgendwelchen linuxbasierten Router/Firewalls laufen zu lassen.
Zur Kontrolle auf längere Sicht habe ich noch ein “date” Aufruf mit eingebaut und lenke die Ausgabe mittels Cronjob in eine Text-Datei um. So habe ich jeden Sonntag den Zeitstempel und das Ergebnis dazu und kann rückwirkend immer sehen ob der Skriptaufruf zu dem besagten Zeitpunkt auch wirklich geklappt hat. Es könnte ja sein dass Dyn irgendwann etwas an Ihrer Loginseite umbauen – vllt sogar weil Sie sich natürlich denken können dass Leute jetzt statische Skripte schreiben – und man würde dann nicht mehr mitbekommen dass das Skript nicht mehr passt.
Wobei angeblich will Dyn jeden ja nochmal per Mail informieren bevor der Account wirklich stillgelegt wird sodass man dann immernoch reagieren kann.
Vielen Dank nochmal für dein Skript + deine Hilfe!
Die Option mit `-k` ist sicher ein guter Workaround, aber ins Skript möchte ich das nicht einbinden. Für etwas gibt es ja HTTPS.
Für die Überwachung des Skripts beende ich das Skript bei einem fehlerhaften Login mit dem Exitstatus von `1`. Wenn der Cronjob dann fehlschlägt, versendet crond ein Mail an den betreffenden User. Die Mailadresse kann in der Crontab mittels `MAILTO=foo@example.org` konfiguriert werden. Natürlich muss ein Mailserver konfiguriert sein (kann auch nur für lokale zustellung aktiv sein).
Gruss und noch viel Spass
Emanuel
Hallo, besteht die Möglichkeit diese Script anzupassen um es auf einem Qnap NAS zu nutzen.
Da ich absoluter Laie bin hat dies ein andere schon probiert und er sagt es läuft nicht auf einem Qnap. Ich hatte das Script in einem Forum Online gestellt und es wurde getestet.
Moin, Cool, auf der QNAP kommt er leider nicht mit den Qookies klar, die herruntergelade Website zeigt dann folgende Meldung an
Our login system uses cookies to uniquely identify your web browser and login session after you enter your
username and password on our site. These cookies do not store your password or any other private information,
and are safe to be stored on even shared computers.
I wonder if dyn won’t figure out about or can filter for those automatism.
Can you confirm there is no way to determine that the login was done via script?
Also shouldn’t there not any logout routines included to simulate a more realistic user behaviour?
I’m not 100% sure, but how could they filter out this automatism? To get a better feeling, i set the User Agent String to Mozilla instead of curl.
Thank you very much for your script. It works very well for me. I changed the user agent string to match my browser.
Keep up the good work.
Thanks and have fun! 😉
Servus!
Besten Dank, fuer das Script!
Der Login funktioniert einwandfrei, jedoch tut es “… grep -E “(Welcome|Hi).*$USERNAME” …” nicht, weshalb “Login failed” in der Ausgabe erscheint. Sollte das nur bei mir der Fall sein, frag ich mich, ob reg. Ausdruecke nicht UEBERALL gleichbedeutend sein sollten?!
mfg Pete
Hallo Pete
Bitte, gern geschehen. Bei mir funktioniert es mit diesem regulären Ausdruck immer noch. Wie sieht denn bei dir die Ausgabe aus, wenn du grep -E $USERNAME machst? Wie wirst Du “begrüsst”? Ich musste schon mal das “Hi” nachträglich hinzufügen.
Danke für die Rückmeldung und Gruss
Emanuel
Ach, es ist (peinlich, ) wie immer: wer lesen kann …
Der Username entsprach nicht ganz dem, was grep als case sensitive command gefunden hat. Entweder ordentlich lesen, oder ein “-i” dazu und alles wird gut. (Natuerlich hab ich mich fuer das “-i” entschieden …)
Wuensche noch ein schoenes Wochenende!
mfg Pete
Hallo Pete
Vielen Dank für das Abklären des Fehlers. Macht Sinn.
Ich habs im Code und auf GitHub jetzt ebenfalls auf grep -i geändert.
Danke und dir auch noch ein schönes Wochenende
Gruss
Emanuel
Hi vielen Dank für das script.
Es hat geklappt mit:
COOKIE=/tmp/dyndnslogin_cookie
OUTPUT=/tmp/dyndnslogin_output
Hallo Bodo
Bitte, gern geschehen.
Dann ist bei Dir scheinbar mktemp nicht verfügbar. Funktioniert aber auch so.
Gruss
Emanuel
Danke für dein Script!
Musste es etwas anpassen, damit es auf meinem QNAP NAS läuft. Zum einen die -k Option aktivieren, da auf meinem NAS kein Zertifikatsbundle installiert ist (wie z.B. auf PC) um diese zu überprüfen und mktemp der BusyBox kann keine Verzeichnisspfade. Aber bis jetzt sieht es aber gut aus.
Gruß
Hallo Uwe
Bitte, freut mich, dass du es gebrauchen kannst und toll, dass du es auf deinnem QNAP laufen lassen kannst mit diesen Änderungen.
Gruss
Emanuel
Hallo HorstLichter
Kannst du mir mitteilen wie und wo du das Script im QNAP verstaut hast.
Danke und Gruss Paul
Wollt nur DANKE sagen!
Kaum installiert man curl und schon läuft das Script auch durch. 😉
Cheers
Matt
Hey Matt
Bitte. Schön, dass das Skript bereits einige Leute im Einsatz haben.
Grz
Emanuel
Hi Emanuel
bei mir funktioniert das Skript seit heute (4.9.13) nur noch, wenn ich den awk-Befehl “print $6” durch “print $6;exit” ersetze.
Ich glaube, das liegt daran, dass “multiform” jetzt zweimal auf der Anmeldeseite vorkommt.
Bitte um Bestätigung. Bin kein Shellscript/awk-Spezialist.
Grüße,
Chris
Hallo Chris
Danke für die Rückmeldung.
Bei mir funktioniert das Skript immer noch. Auf der Seite https://account.dyn.com/ kommt bei mir die Zeile mit multiform nur einmal vor. (Überprüfbar mit curl -s https://account.dyn.com/ | grep -i multi).
Kommt es immernoch zweimal vor? Ansonsten ist die Lösung mit dem exit innerhalb des awk ok, sofern es das richtige multiform nimmt.
Danke für die Antwort und Gruss
Emanuel
Hallo Emanuel,
oh, du hast Recht. Ich hätte schwören können, dass https://account.dyn.com/ vorgestern genauso aussah wie https://account.dyn.com/entrance/ und damit zwei “multiform”s hatte.
Grüße,
Chris
Challo Chris
Vielleicht wars ja so 😉 Jetzt jedenfalls nicht mehr. Ansonsten hätte deine Lösung mit dem exit funktioniert.
Gruss
Emanuel
Hallo Emanuel,
danke für deine Arbeit.
Ich wollte zunächst etwas ähnliches erstellen, bin dann aber über dein Skript gestolpert – Arbeit gespart. 😉
Ich habe für mich noch eine Anpassung gemacht, damit der Login nicht immer zur gleichen Zeit am selben Tag erfolgt. Bin da vielleicht etwas paranoid.
Per Cron lasse ich den Login jeden zweiten Tag ausführen. Im Skript prüfe ich per Zufall, ob der Job ausgeführt werden soll.
Falls ja, wartet der Login zunächst für max. 3 Stunden.
if [ $(($RANDOM%2)) == 1 ]
then
# Delay login upto 3 hours
DELAY=$(($RANDOM%10800))
sleep $DELAY
else
# No execution this time
exit 0
fi
Grüße
Markus
Hallo Markus
Bitte.
Nette Idee.
Gruss
Emanuel
Super Skript, nutze es selbst auf einen Debian NAS, konnte mein Problem durch mitlesen beheben, grep -i war der Tip hier. Nun müsste mir das skript noch eine Meldung senden.
topie
Hallo Topie
Schau mal in der lokalen Mailbox vom User nach, unter welchem du das Skript per Cronjob startest. Dort hat Du eine E-Mail (vorausgesetzt du hast den Maildienst mindestens für die lokale Zustellung aktiviert/konfiguriert).
GRZ
Emanuel
hi, wäre es möglich, das angepasste script für das QNAP NAS zu veröffentlichen? Evtl. noch ein paar worte dazu, wie und wo man das im NAS “einbaut”. Wäre super! vielen dank schonmal!
Hallo wbk
Ich habe das Script für das QNAP nicht. Das hat “uwe” zum Laufen gebracht (http://emanuelduss.ch/2013/05/zwingender-monatlicher-login-bei-dyndns-org-automatisieren/#comment-17942).
Scheinbar soll die Zeile
--data "username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM" \
https://account.dyn.com/
um ein -k ergänzt werden (damit werden die SSL-Zertifikate nicht überprüft):
--data "username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM" \
https://account.dyn.com/
Und da es mktemp auf dem QNAP unter Busybox nicht gibt, kann man folgenden Befehl verwenden:
PROGNAME=dyndnslogin
COOKIE="date +/tmp/${PROGNAME}_cookie_%Y-%m-%d_%H-%M-%S"
mkdir $COOKIE || exit 1
OUTPUT="date +/tmp/${PROGNAME}_output_%Y-%m-%d_%H-%M-%S"
mkdir $OUTPUT || exit 1
USERAGENT="Mozilla/5.0"
...
Somit erstellt du die temporären Verzeichnisse manuell.
So sieht das ganze Script aus (ich habs nicht getestet, da ich kein QNAP NAS habe):
########################################################################
#
# dyndnslogin
# Automate login to prevent account expiration
#
########################################################################
########################################################################
# DynDNS Settings (default-value, overwrite with $1 and $2)
DEFAULT_USERNAME="username"
DEFAULT_PASSWORD="password"
# Import settings from /etc/ddclient.conf if available
DDCONF="/etc/ddclient.conf"
if [ -r "$DDCONF" ] && grep -q "^server=members.dyndns.org" "$DDCONF"
then
DEFAULT_USERNAME="`awk -F= '/^login=/{ print $2 }' $DDCONF`"
DEFAULT_PASSWORD="`awk -F= '/^password=/{ print $2 }' $DDCONF`"
fi
########################################################################
# Variabeln
USERNAME=${1:-$DEFAULT_USERNAME}
PASSWORD=${2:-$DEFAULT_PASSWORD}
PROGNAME=dyndnslogin
COOKIE="date +/tmp/${PROGNAME}_cookie_%Y-%m-%d_%H-%M-%S"
mkdir $COOKIE || exit 1
OUTPUT="date +/tmp/${PROGNAME}_output_%Y-%m-%d_%H-%M-%S"
mkdir $OUTPUT || exit 1
USERAGENT="Mozilla/5.0"
########################################################################
# Main
MULTIFORM=`curl -s -A $USERAGENT -c $COOKIE https://account.dyn.com \
| awk -F\' '/multiform/{ print $6 }'`
curl -s --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
--data "username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM" \
https://account.dyn.com/
if grep -i -E "(Welcome|Hi).*$USERNAME" $OUTPUT > /dev/null 2>&1
then
echo Login successful
else
echo Login failed
FAILED="true"
fi
rm $COOKIE
rm $OUTPUT
if [ "$FAILED" = "true" ]
then
exit 1
fi
# EOF
Ich hoffe das hilft Dir.
Gruss
Emanuel
Hallo,
vielen Dank für eure Mühe, diese Lösung zur Verfügung zu stellen. Setze das Script erfolgreich auf meinem QNAP ein.
Wie müßte das Script für GMX angepasst werden? Die “deaktivieren” leider die free Accounts ohne Nachricht und Vorwarnung, falls man sich nicht regelmäßig über das Webinterface einloggt. 🙁
Danke
Hallo Emanuel,
ich habe versucht das Script auf noip.com anzupassen, aber der Aufruf
curl -s –location -A “$USERAGENT” -b $COOKIE -c $COOKIE -o $OUTPUT –data “username=$USERNAME&password=$PASSWORD&submit_login_page=1&Login=&submit=Login” http://www.noip.com/members/
bringt leider immer nur wieder die Loginpage als Output hervor. Mache ich etwas falsch?
Beste Grüße,
Patrick
als erstest : schönes script.
was vieleicht noch fehlt ist nen logout:
https://account.dyn.com/entrance/?__logout=1
@Patrick warum machst Du es nicht mit : “https://www.noip.com/login?….”
Hi,
hast du das zum laufen bekommen?
Da dyndns seinen dienst für free user einstellt suche ich eine alternative…
danke & gruß
vip
Hallo vip
Du kannst auch selber ein dynamischer DNS Service betreiben: http://emanuelduss.ch/2013/07/eigener-dynamischer-dns-ddns-service-betreiben-eigenes-dyndns/
Grz
Emanuel
Danke für den Tipp
Ich habe zwar einen Rootserver aber traue mir das Thema Bind noch nicht zu…
Deshalb habe ich nach der andere Lösung geguckt 😉
gruß
vip
Very nice script!
as I’m usually not in front of the monitor I just changed:
echo Login successful
to
echo Login successful | mail -s”DynDNS login successful” EMAIL@DOMAIN.TLD
and
echo Login failed
to
echo Login failed | mail -s”DynDNS login FAILURE” EMAIL@DOMAIN.TLD
justmy2cents
Hello Pelegrine
Thanks.
When a Script runned by cron has an output, then the output is sent to the crontabs user local mail address as default (if you have installed an MTA). You just want to change the Mail Address if you don’t want going the mail to the local user mailbox.
But thanks for your feedback 🙂
Grz
Emanuel
Parsing of ddclient.conf does not work properly, i.e. credentials have:
somepass \
with trailing slash.
Also parsing ddclient.conf fails if you have multiple accounts in it. Only the section of members.dyndns.org should be parsed. Next thing, what about having more than one dyndns-account in ddclient.conf?
Hi,
hat das skript schon mal einer bei ner dreambox mit enigma2 getestet?
kann man das einfach so copy/past verwenden, natürlich mit user und pw anpassung?
gruß christian
Hallo Christian
Ich selber habe keine Dreambox, aber falls die nötigen Tools wie curl, mktemp, cron, awk, … vorhanden sind, sollte das kein Problem sein. Teste doch mal und schreibe obs funktioniert hat.
Danke und Gruss
Emanuel
Hi!
Found your script via google too – nice work!
Just my 2c – when intended to run via cron, final echo-commands aren’t that helpful.
So change lines 45 and 49 to:
logger -p notice “$(basename $0) – dyndnslogin successful!”
and
logger -p notice “$(basename $0) – dyndnslogin failed!”
After script has run you can see the ouput in syslog now (via cat /var/log/syslog eg):
Jan 17 08:06:13 logger: ./dyndnsLogin.sh) – dyndslogin failed
Hello
Thanks.
The output of a crontab command is automatically sent to the crontab’s user mail address on the system. So if any command in the crontab does an output, i’ll see the output directly in my inbox.
The logger command is also a nice way to do it, but then you have to check the logfile (manually or by another tool). Just generate a standard output is the simplest way to do it, because you get immediately notified if the script was run.
Greets
Emanuel
Hi,
yes you’re right about that. Of course one might also consider combining both solutions- depends on what you do prefer.
Anyway- you have already done a fine job by writing and sharing this script, so I wanted to contribute my way too -as a way of “giving back”.
Best regards
Hi JonDoe
I like people like you, who test and give feedback to my work. Thanks!
Often, in my posts, I want to keep the stuff as simple as possible, because then it’s more easy for other people to adapt the scripts and get the idea what I mean. I think there is always another (or even better) way to do it. (I think writing to the syslog or systemd journal and then check the journal entry is way better, but this has the need of extra software. Maybe i post log monitoring someday…).
Thanks and greetings
Emanuel
Danke, super Idee & Script!
I am running a CentOS 5.x based server and had to do the following modifications to get it running:
1. My ddclient.conf is located in /etc/ddclient rather than just /etc for my system. Might be that was my personal decision during installation time. Anyway, it has been done long time ago and I don’t really remember.
DDCONF=”/etc/ddclient/ddclient.conf”
2. The mktemp command was complaining about its usage, so I quickly consulted the man page and modified it according to the instructions there. No complains anymore now.
COOKIE=`mktemp -t ${PROGNAME}_cookie_XXXXX`
OUTPUT=`mktemp -t ${PROGNAME}_output_XXXXX`
Thanks and keep up the great work
Vielen Dank 🙂
It looks like `mktemp` has a different usage on various systems. I saw this: OpenBSD has other options as Debian and ArchLinux. CentOS in the current version uses the same mktemp as Debian and ArchLinux from the GNU coreutils package. Maybe you have an older version of mktemp in CentOS 5.x?
But it’s simple and allowed (b/c i shared the code ant it’s OpenSource) to modify the script on your needs.
Thanks for your feedback.
Greetings
Emanuel
Danke für das Skript!
Habe es für das GMX-Login Problem angepasst.
########################################################################
#
# GMX Login
# Automate login to prevent account expiration
# based on http://emanuelduss.ch/2013/05/zwingender-monatlicher-login-bei-dyndns-org-automatisieren/
#
########################################################################
########################################################################
# GMX Settings (default-value, overwrite with $1 and $2)
# URL-Encoding
# http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters
DEFAULT_USERNAME="<name>%40gmx.de"
DEFAULT_PASSWORD="Geheim"
########################################################################
# Variabeln
USERNAME=${1:-$DEFAULT_USERNAME}
PASSWORD=${2:-$DEFAULT_PASSWORD}
PROGNAME=gmx
COOKIE=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_cookie_XXXXX`
OUTPUT=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_output_XXXXX`
USERAGENT="Mozilla/5.0"
########################################################################
# Main
# --data "username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM" \
curl -s --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
--data "AREA=1&EXT=redirect&EXT2=&dlevel=c®ion=de&id=${USERNAME}&p=${PASSWORD}" \
https://service.gmx.net/de/cgi/login
# check for success
if grep -i -E "failed" $OUTPUT > /dev/null 2>&1
then
echo Login failed
FAILED="true"
else
echo Login successful
# extract sid in order to logout successfully
sid=`perl -ne 'if (/nocookie.(sid=.*).../) { printf "$1\n"; }' $OUTPUT`
curl -s --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
https://navigator.gmx.net/logout?$sid
fi
rm $COOKIE
rm $OUTPUT
if [ "$FAILED" = "true" ]
then
exit 1
fi
# EOF
Hallo Michael
Sehr schön, dass das geklappt hat!
Gruss
Emanuel
Danke für diese Erweiterung, GMX muss ja wirklich auch regelmäßig eingeloggt werden, sonst wird das Konto inaktiv, das hat mich schon mal ziemlich in Bedrängnis gebracht.
Ich mach das mit PHP und den IMAP funktionen, in erster Linie aber, um regelmäßig die lästige GMX-Mailings zu löschen. Nebeneffekt ist die Anmeldung damit das Konto nicht deaktiviert wird.
Falls jemand das Skript will, einfach melden, ist mit DB-Anbindung (MySQL) für die Dokumentation der Löschungen der Werbung.
Gruß franc
Hallo Franc
Wenn du willst, kannst du das Skript auf pastebin laden und hier verlinken? Vielleicht kann es ja jemand brauchen.
Gruss
Emanuel
und das hier fuzt super
wollte einfach danke sagen
Super, freut mich! Bitte.
Hallo Emanuel,
danke für die tolle Arbeit!
Dein Script läuft auf meinem Linux-Server einwandfrei. Doch habe ich folgendes fest gestellt: trotz des erfolgreichen Einloggens, wird das Datum (Letzter Update) auf der DynDns.org-Seite nicht aktualisiert. Es kann natürlich damit zusammen hängen, dass DynDns deinen Trick durchschaut hat und die Seite geändert wurde :)… Dieses Verhalten beobachte ich schon seit November. Dein Script liefert “Login successful” (wird wöchentlich ausgeführt). Die IP ist trotzdem nach 30 Tagen nicht mehr erreichbar, bis man sich manuell einloggt und die Adresse refresht.
Ich muss noch dazu sagen, dass ich beide Gratis-Adressen benutze, wobei in meinem Router nur eine von den beiden fest angegeben ist. Was mir noch aufgefallen ist, ist die Tatsache, dass nach dem Ablauf der 30 Tage es nicht mehr reicht sich einfach Anzumelden, man muss die Hostadresse anklicken und die Einstellungen erneut abspeichern. Erst dann ist die Adresse wieder “online”.
Würde mich über dein Feedback freuen!
Gruß
ds810
Hallo ds810
Bitte, freut mich, dass du das Script nutzt.
Ich selber brauche DynDNS nicht mehr aktiv (Script läuft aber weiterhin alle 15 Tage), sondern habe mir selbst einen Dynamischen DNS Dienst eingerichtet (auch hier im Blog beschrieben).
Falls die bei DynDNS registrierte Domain ablaufen würde, bekommt man ein Mail. Dieses Mail habe ich seit diesem Blogpost nie mehr erhalten und manuell habe ich mich nie eingeloggt. Trotzdem läuft die Aktuallisierung der Domain mit meinem Router immernoch problemlos. Ich konnte also keine Probleme feststellen.
Kann man die letzten Logins irgendwo abfragen? Habs nirgends gefunden.
Vielleicht liegt es wirklich daran, dass du zwei Domains hast. Falls du die zweite nicht brauchst, kannst du sie ja mal löschen und schauen, ob es dann funktioniert. Da ich das Problem nicht habe, kann ich es leider schlecht debuggen. Was meinst du?
Gruss
Emanuel
Hey,
ich werde mal die zweite Domain löschen und beobachte mal das Verhalten in den nächsten 30 Tagen. Ich werde mich dann in deinem Blog melden, wenn ich neue Erkenntnisse gewonnen habe.
Zum Fehlerbild:
Ich habe ebenfalls keine Email mehr bekommen. Das Script meldete “Login successful” und trotzdem lief es nach 30 Tagen nicht mehr.
PS: ich habe das Script, nach der Feststellung, dass die Domain nicht mehr funktioniert, zusätzlich händisch ausgeführt. Ohne erfolg.
Aber wie schon gesagt, ich beobachte es noch ein Mal mit nur einer Domain.
Gruß
ds810
Hallo, dein script sieht toll aus, würde es gern auch benutzen. Jedoch habe ich auch auf einen Account zwei dyndns adresse erstellt. Ich würde es gern trotzdem versuchen mit beiden. Leider weiß ich nicht wie ich dein script abändern muss, damit beide adresse aktuallisiert werden.
Der ds810 hat ja auch zwei jedoch probleme beide zu aktuallisieren. Wäre es nicht einfach möglich zwei scripte zu erstellen die jeweils die abfrage machen? Sprich eine die am Sonntag um 23.05Uhr startet und die andere um 23.15Uhr!?
gruß
chris
Hallo Chris
Man müsste zuerst die Formulare analysieren, welche abgeschickt werden müssen und dann so das Skript an diese Situation anpassen, damit beide Domains aktuallisiert werden.
Was musst Du nach dem einloggen genau machen, damit die Domains verlängert werden?
Gruss
Emanuel
Hi.
I’m trying to get the script to work on a Raspberry Pi. Can anybody help me with the script for this, and what I need to install, in order for it to work?
Right now I get two problems. It doesn’t create the $OUTPUT file and I get an error: “$’\302\240′: command not found” where it should say “Login Succes” (I think).
Can anybody help me?
Best regards
Mikkel
P.S. You can answer in German if you prefere.
Hi Mikkel
Which Linux distrobution are you using on your Raspberry Pi? Maybe you have to install following tools:
I assume, the curl package is not installed, because the coreutils package is mandatory for a Linux OS.
You don’t see any other error output?
Try to execute the script with $ sh -x dyndnslogin. Then you see the last command which failed.
Best regards
Emanuel
P.S: I just saw that i could write in german after i wrote back in english 🙂 Maybe an english reader can profit too…
Thank you for your response.
I’m running a Raspberry Pi with Raspian. The Coreutils seems to be installed, and I have now installed the cURL. The result is the same. In the end it says (sh -x):
+ grep -i -E (Welcome|Hi). *’MyUsername’ /tmp/dyndnslogin_output
+ echo Login successful
/XXX/dyndnslogin: line 46: /XXX/dyndnslogin: : command not found
+ rm /tmp/dyndnslogin_cookie
+ [ = true ]
Ofcource I don’t know it it has actually logged in.
I have deleted the “rm /tmp/dyndnslogin_output” in the script, but in the /tmp there still is no dyndnslogin_output, so it looks lige this doesn’t get genereted.
Any ideas?
Best regards
Mikkel
Hallo Mikkel
This looks like an Error from `mktemp`, which is used to create the temporary files for the cookies and for the output. I use mktemp because then I don’t get conflicts with other filenames. You can try to replace the code
COOKIE=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_cookie_XXXXX`
OUTPUT=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_output_XXXXX`
USERAGENT="Mozilla/5.0"
with
COOKIE="date +/tmp/${PROGNAME}_cookie_%Y-%m-%d_%H-%M-%S"
mkdir $COOKIE || exit 1
OUTPUT="date +/tmp/${PROGNAME}_output_%Y-%m-%d_%H-%M-%S"
mkdir $OUTPUT || exit 1
Then run again (to debug aso with `sh -x`). Maybe you have no permissions to create this directory? Then you can create a temporary file in your home directory where you have the proper permissions.
Does it work?
Best regards && good luck 🙂
Emanuel
Hi again.
Sorry. Still errors. But now that DYNDNS have stopped there free accounts, I’m going to look for something else insted.
But thank you for your help.
Best regards
Mikkel
Hi Mikkel
Yes. If you have a own Nameserver, you can configure your own dyndns service: http://emanuelduss.ch/2013/07/eigener-dynamischer-dns-ddns-service-betreiben-eigenes-dyndns/
🙂
Greets
Emanuel
Emanuel folgendes:
Login auf:
https://de.account.dyn.com/entrance/
gehe dann auf meine Hosts
https://de.account.dyn.com/dns/dyndns/
klicke dann auf eins der beiden dns adressen:
https://de.account.dyn.com/dns/dyndns/XXXXXXX1.dyndns.org
https://de.account.dyn.com/dns/dyndns/XXXXXXX2.dyndns.org
und dann drücke ich auf save changes…. laut quell text beinhaltet der “Save Changes” Button folgenden script, falls es dir etwas hilft:
$(".tag_checkbox").hide();
$(".tag_label").addClass('checktag');
$(".tag_label").next("br").remove();
$(".tag_label").after( document.createTextNode(" ") );
$(".tag_checkbox:checked").next("label").addClass("tagup");
$(".tag_label").click(function(){
var cb = $(this).prev("input");
if (cb.is(':checked')) {
cb.attr("checked", false);
$(this).removeClass("tagup");
} else {
cb.attr("checked", true);
$(this).addClass("tagup")
}
return false;
});
});
function service_type_click (value) {
var webhop = (value == "WebHop");
var offline = (value == "Offline");
find_id('block_ip').style.display =
webhop ? "none" : "block";
find_id('block_webhop').style.display = !webhop ? "none" : "block";
find_id('block_webhopip').style.display = !webhop ? "none" : "block";
find_id('block_offlineip').style.display = !offline ? "none" : "block";
}
function cloak_active_click (value) {
find_id('block_title').style.display = !value ? "none" : "block";
}
function domx_click (value) {
var mx = find_id('block_domx');
if (mx) mx.style.display
= !value ? "none" : "block";
}
function ttl_click (show) {
find_id('span_ttl').style.display
=
show ? "none" : "block";
find_id('block_ttl').style.display
= !show ? "none" : "block";
}
function init_all () {
find_id('a_clone').style.display = "inline";
service_type_click(getValue('service'));
cloak_active_click(getValue('cloak_active'));
ttl_click(getValue('ttl') != 60);
domx_click(getValue('domx'));
}
init_all();
//
Hallo Chris
Das sollte also schon möglich sein.
Du loggst dich normal ein (bis Login Successful kommt) und danach sendest du (wahrscheinlich per POST) das “Save”-Formular ab. Das ganze in einem Loop, damit man jede Domain durchmacht.
Das könnte so aussehen (Code nicht getestet, warscheinlich müssen noch die richtigen POST-Parameter und evtl. noch ein neuer Token (multiform) angepasst werden):
for domain in $DOMAINS
do
curl -s --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
--data-urlencode "submit=Save&multiform=$MULTIFORM" \
https://account.dyn.com/
done
Ich hab da keine Domain zum probieren, bin aber gespannt ob es läuft.
Gruss
Emanuel
Ich hab das geniale Skript für die automatische DynDNS Anmeldung ein bisschen erweitert, vielleicht ist das ja interessant für jemand, ist mit E-Mail-Benachrichtigung, wenn die Anmeldung schief läuft:
########################################################################
#
# dyndnslogin
# Automate login to prevent account expiration
#
########################################################################
########################################################################
# DynDNS Settings
USERNAME="HIER DEN BENUTZERNAMEN EINTRAGEN"
PASSWORD="HIER DAS PASSWORT EINTRAGEN"
MAILTO="franc@example.org"
MAILFROM="admin@example.org"
########################################################################
# Variabeln
PROGNAME=dyndnslogin
COOKIE=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_cookie_XXXXX`
OUTPUT=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_output_XXXXX`
USERAGENT="Mozilla/5.0"
########################################################################
# Main
MULTIFORM=`curl -s -A $USERAGENT -c $COOKIE https://account.dyn.com \
| awk -F\' '/multiform/{ print $6 }'`
curl -s --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
--data "username=$USERNAME&password=$PASSWORD&iov_id=&submit=Log+in&multiform=$MULTIFORM" \
https://account.dyn.com/
if grep -E "(Welcome|Hi).*$USERNAME" $OUTPUT > /dev/null 2>&1
then
echo "Login $USERNAME successful" # | mail $MAILTO -s "Login von $USERNAME bei DynDNS erfolgreich" -a "From: dyndns_login_$USERNAME.sh <$MAILFROM>"
else
echo "Login $USERNAME failed"
echo "Der Login von Benutzer $USERNAME auf dyn.com (DynDNS) mit dem Shellscript dyndns_login_$USERNAME.sh ist fehlgeschlagen!" | mail $MAILTO -s "Login von $USERNAME auf DynDNS NICHT erfolgreich!" -a "From: dyndns_login_$USERNAME.sh <$MAILFROM>"
FAILED="true"
fi
rm $COOKIE
rm $OUTPUT
if [ "$FAILED" = "true" ]
then
exit 1
fi
# EOF
Zudem rufe ich mit einem ganz einfachen Skript alle Skripts im Verzeichnis auf, die mit dyndns_login_ anfangen, so kann ich mehrere Loginskripts mit nur einem Cron starten, ist übersichtlicher:
# fcw: 2014-04-04: alle Shellskripts mit dyndns_login_*.sh nacheinander ausfuehren
cd /usr/local/bin
for i in dyndns_login_*.sh;
do $i
done
Bisher läuft das bei mir wöchentlich, noch habe ich keine Deaktivierung erlebt, das Skript funktioniert also wohl noch.
Hallo Franc
Gute Idee.
Standardmässig wird alles, was bei einem Cronjob auf STDOUT/STDERR ausgegeben wird per Mail an den User der jeweiligen Crontab geschickt. So bekomme ich es auch mit, falls etwas nicht läuft. Die Mailadresse kann man mit der Variable `MAILTO` in der Crontab überschreiben. Da ist vielleicht die schnellere Lösung?
Danke für den Input und Gruss
Emanuel
Hallo Emanuel,
vielen Dank für dieses Skript. Schade, dass ich das erst heute gefunden habe 🙂 Jetzt, nachdem es bald keine kostenlosen Accounts mehr geben wird bei Dyn. Ich gehe davon aus, dass andere Anbieter nachziehen werden und ebenfalls ein regelmässiges Login erfordern, damit das Konto nicht deaktiviert wird. Dein Skript werde ich dann schon parat haben 😉
Unabhängig davon – mir gefällt dein Skript. Ordentlich programmiert und gut dokumentiert!
Viele Grüsse
Bernd
Hallo Bernd
Vielen Dank.
Gruss
Emanuel
Ich habe es mit dem Script versucht, hat leider nicht so hin gehauen. Habejetzt einfach nach http://www.clickip.de gewechselt ,klappt genauso gut wie DynDns
Hallo Rainer
AFAIK gibt es jetzt gar kein kostenloses DynDNS.org mehr. Ich habe mir selber eine Lösung gebaut: Eigenes DynDNS.
Gruss
Emanuel
der Trade ist ja schon älter,
habe jetzt das Script für no-ip angepasst
sollte bedarf bestehen, einfach hier posten.
Hallo Andi
Dein Angepasste No-IP Script würde mich brennend interessieren.
Kannst du dies hier veröffentlichen?
Danke dir 🙂
Ich hoffe Andi sieht diese Nachricht.
Das ist ja einer Superarbeit…
Kannst du das für No-ip.com angepasste script hier bitte ebenfalls veröffentlichen…?
Jetzt bist du schon der zweite, der das Script will. Es scheint aber so, als ob Andi nicht mehr hier vorbeischaut 🙁
Ja hoffe ich auch 😉
Bin schon sehr lange auf der suche nach einem funktionierenden No-Ip Auto-WebLogin Script.
Hi,
schade das script von “Michael 2014-01-25 at 10:50” scheint nicht mehr zu gehen. bekomme immer “login failed”.
auch hätte mich das script von “franc 2014-04-04 at 22:45” interessiert…
doof das sie sich nicht mehr gemeldet haben.
habe leider auch nicht gefunden das Sie das woanders publiziert haben….
Gruß
Vip
Hey,
habe mir grade eben mal die Scripte angeschaut.
Aber warum macht Ihr Euch die Arbeit wenn es kostenlose DynDns anbieter gibt, die nicht monatlich bestätigt werden müssen? Panel1.de und twodns.de zum Besipiel.
Man kann es auch komplett selber betreiben, damit ist man gar nicht mehr abhängig von fremden Anbietern und hat alles selber unter Kontrolle: https://emanuelduss.ch/2013/07/eigener-dynamischer-dns-ddns-service-betreiben-eigenes-dyndns/
Hi zusammen,
gibt es das Skript auch für Selfhost.de?
bzw. wie kann ich es ändern damit dies für Selfhost.de funktoniert?
Besten Dank + Beste Grüße
Sebastian
Hey Sebastian
Grundsätzlich ist das auch für Selfhost.de möglich, doch Erfahrungsgemäss sind alle Login Formulare anders aufgebaut und deshalb müsste man das Skript stark anpassen. Hier hat es jemand für GMX angepasst: https://emanuelduss.ch/2013/05/zwingender-monatlicher-login-bei-dyndns-org-automatisieren/#comment-19933
Du müsstest einen Login Request aufzeichnen und schauen welche Parameter es verwendet. Diese können dann mit curl gesendet werden. Je nach dem muss noch ein Token ausgelesen werden (wie das multiform Feld in diesem DynDNS Login Skript).
Das bedeutet, dass es unter Umständen schon etwas schwierig sein kann das Skript so anzupassen. Wenn du etwas lernen möchtest, dann ist das aber eine super Gelegenheit. Ansonsten musst du dir einen anderen Anbieter suchen
;-).
Gruss,
Emanuel