Zwingender monatlicher Login bei DynDNS.org automatisieren (Auto Login Script)

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.

#!/usr/bin/env bash
########################################################################
#
# dyndnslogin
# Automate login to prevent account expiration
#
########################################################################
<code lang="bash">

########################################################################
# DynDNS Settings (default-value, overwrite with $1 and $2)
DEFAULT_USERNAME=”username”
DEFAULT_PASSWORD=”password”

<code lang="bash">

# 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

<code lang="bash">

########################################################################
# Variabeln
USERNAME=${1:-$DEFAULT_USERNAME}
PASSWORD=${2:-$DEFAULT_PASSWORD}

<code lang="bash">

PROGNAME=”dyndnslogin”
COOKIE=”`mktemp –tmpdir=”/tmp” -t ${PROGNAME}_cookie_XXXXX`”
OUTPUT=”`mktemp –tmpdir=”/tmp” -t ${PROGNAME}_output_XXXXX`”
USERAGENT=”Mozilla/5.0″

<code lang="bash">

########################################################################
# Main

<code lang="bash">

MULTIFORM=`curl -s -A $USERAGENT -c $COOKIE https://account.dyn.com \
| awk -F\’ ‘/multiform/{ print $6 }’`

<code lang="bash">

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/

<code lang="bash">

if grep -q -i -E “(Welcome|Hi).*$USERNAME” “$OUTPUT”
then
echo “Login successful”
else
echo “Login failed”
FAILED=”true”
fi

<code lang="bash">

rm “$COOKIE”
rm “$OUTPUT”

 
if [ "$FAILED" = "true" ]
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:

5 23 * * 0 /usr/local/bin/dyndnslogin

Somit wird an jedem Sonntag um 23:05h ein Login im DynDNS.org Account gemacht.

Links und weitere Informationen

109 thoughts on “Zwingender monatlicher Login bei DynDNS.org automatisieren (Auto Login Script)”

  1. Hallo,
    wo wird das Script für DYNDNS eigentlich eingebaut ? Z.B bei Freetz.
    Der Crontab is klar.

    Gruß Achim

    Reply
    • 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

      Reply
  2. 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!

    Reply
  3. 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

    Reply
    • Hallo Hasenstolz

      In der ersten Zeile kann noch der Shebang eingefügt werden:

      #!/bin/bash

      bzw.

      #!/bin/sh

      (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:

      COOKIE=/tmp/dyndnslogin_cookie
      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

      Reply
  4. 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.

    Reply
    • 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):

      wget ----load-cookies /tmp/cookie --save-cookies /tmp/cookie --keep-session-cookies -q -A "Mozilla/5.0" -O -

      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

      Reply
      • 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

        Reply
        • 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

          Reply
  5. : 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….

    Reply
  6. Manchmal wird man statt mit “Welcome” auch mit “Hi” begrüßt.
    Daher habe ich die Erfolgsüberprüfung etwas modifiziert (:

    A=`grep -E "<span>Welcome.*$USERNAME" $OUTPUT|wc -l`
    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

    Reply
    • Hallo Schlaubi

      Danke für den Hinweis. Das kann man auch direkt auf einmal überprüfen:

       if grep -E "(Welcome|Hi).*$USERNAME" $OUTPUT > /dev/null 2>&1

      Ich habe es in den Code aufgenommen. Thx.

      Gruss
      Emanuel

      Reply
  7. 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.

    Reply
    • 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

      Reply
      • 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:

        curl -s -k --location -A "$USERAGENT" -b $COOKIE -c $COOKIE -o $OUTPUT \
           -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.

        Reply
  8. 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

    Reply
    • 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

      Reply
  9. 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!

    Reply
    • 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

      Reply
  10. 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.

    Reply
  11. 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.

    Reply
  12. 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?

    Reply
  13. 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.

    Reply
  14. 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

    Reply
    • 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

      Reply
      • 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

        Reply
        • 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

          Reply
  15. Pingback: Anonymous
  16. Hi vielen Dank für das script.

    Es hat geklappt mit:

    COOKIE=/tmp/dyndnslogin_cookie
    OUTPUT=/tmp/dyndnslogin_output

    Reply
  17. 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ß

    Reply
    • 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

      Reply
    • Hallo HorstLichter

      Kannst du mir mitteilen wie und wo du das Script im QNAP verstaut hast.

      Danke und Gruss Paul

      Reply
  18. Wollt nur DANKE sagen!

    Kaum installiert man curl und schon läuft das Script auch durch. 😉

    Cheers
    Matt

    Reply
  19. 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

    Reply
  20. 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.

    # Do not run on every call
    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

    Reply
  21. Pingback: mcnesium.com
  22. 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

    Reply
    • 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

      Reply
  23. 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!

    Reply
    • 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

      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/

      um ein -k ergänzt werden (damit werden die SSL-Zertifikate nicht überprüft):

      curl -k -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/

      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):

      #!/bin/bash
      ########################################################################
      #
      # 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

      Reply
  24. 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

    Reply
  25. 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

    Reply
  26. 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

    Reply
    • 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

      Reply
  27. 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?

    Reply
  28. 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

    Reply
    • 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

      Reply
  29. 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

    Reply
    • 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

      Reply
      • 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

        Reply
        • 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

          Reply
  30. 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

    Reply
    • 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

      Reply
  31. Danke für das Skript!

    Habe es für das GMX-Login Problem angepasst.

    #!/bin/bash
    ########################################################################
    #
    # 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&region=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
    Reply
    • 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

      Reply
  32. 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

    Reply
    • 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

      Reply
      • 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

        Reply
  33. 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

    Reply
    • 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

      Reply
  34. 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.

    Reply
    • Hi Mikkel

      Which Linux distrobution are you using on your Raspberry Pi? Maybe you have to install following tools:

      • mktemp: In Arch Linux and Debian in the package coreutils
      • curl: In Arch Linux and Debian in the package curl

      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…

      Reply
      • 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

        Reply
        • 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

          PROGNAME=dyndnslogin
          COOKIE=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_cookie_XXXXX`
          OUTPUT=`mktemp --tmpdir="/tmp" -t ${PROGNAME}_output_XXXXX`
          USERAGENT="Mozilla/5.0"

          with

          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

          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

          Reply
  35. 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:

    $(document).ready(function(){
    $(".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();
    //
    Reply
    • 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):

      DOMAINS="foo.dyndns.org bar.dyndns.org"

      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

      Reply
  36. 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:

    #!/bin/sh
    ########################################################################
    #
    # 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:

    #!/bin/sh

    # 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.

    Reply
    • 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

      Reply
  37. 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

    Reply
  38. der Trade ist ja schon älter,
    habe jetzt das Script für no-ip angepasst
    sollte bedarf bestehen, einfach hier posten.

    Reply
  39. Ja hoffe ich auch 😉
    Bin schon sehr lange auf der suche nach einem funktionierenden No-Ip Auto-WebLogin Script.

    Reply
  40. 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

    Reply
  41. 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.

    Reply
  42. 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

    Reply
    • 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

      Reply

Leave a Reply to Emanuel Duss Cancel reply