Bash: Update-Script für NO-IP.com (DynDNS)

Bash: Update-Script für NO-IP.com (DynDNS)

Mittlerweile habe ich für Mess- und Monitoringzwecke eine Vielzahl an Raspberry Pis im Einsatz. Da diese in der Regel hinter Internetanschlüssen mit dynamischer IP hängen, setze ich dafür seit einiger Zeit no-ip.com als DynDNS-Dienst ein. Jedoch hat der von NO-IP angebotene Dynamic DNS Update Client (DUC) bei mir nie wirklich zuverlässig funktioniert und somit hatte ich regelmäßig keinen Zugriff mehr auf die Raspberry Pis. Ich habe mir deshalb kurzerhand ein kleines Bash-Script zur zuverlässigen und schnellen Aktualisierung der IP-Adresse geschrieben. Das Script ist mit Sicherheit nicht perfekt, verrichtet jedoch schon seit Monaten zuverlässig seinen Dienst.

Die Funktionsweise ist schnell erklärt:

  • das Script ermittelt mittels Cronjob regelmäßig die aktuelle IP
  • die aktuelle IP wird mit der zwischengespeicherten IP verglichen
  • hat sich die IP geändert, wird dies NO-IP per curl mitgeteilt
  • die neu ermittelte IP wird für zukünftige Vergleiche zwischengespeichert
  • sämtliche IP-Updates und aufgetretene Fehler werden protokolliert

 


Schwierigkeitsgrad:


Wie oben bereits beschrieben, verwendet das Script curl für den Zugriff auf NO-IP. Curl muss daher zuerst installiert werden:

$ sudo apt-get install curl

Anschließend wird das Script unter /usr/local/bin/noip_updater.sh abgelegt und die Rechte angepasst:

$ sudo nano /usr/local/bin/noip_updater.sh
$ sudo chmod 700 /usr/local/bin/noip_updater.sh

 

Das Script

In die Datei noip_updater.sh muss folgender Inhalt kopiert und die Variablen USERNAME, PASSWORD und HOST angepasst werden:

#!/bin/bash

# ------------------------------------------------------- # CONFIG # ------------------------------------------------------- USERNAME="dein-noip-benutzername" PASSWORD="dein-noip-passwort" HOST="dein-noip-host.ddns.net" LOGFILE=/var/log/noip.log IPFILE=/tmp/current_ip USERAGENT="Datenreise NOIP Updater/0.4"
if [ ! -e $IPFILE ]; then touch $IPFILE if [ $? -ne 0 ]; then LOGTEXT="IP file could not be created." LOGDATE="[$(date +'%d.%m.%Y %H:%M:%S')]" echo "$LOGDATE $LOGTEXT" >> $LOGFILE exit 1 fi elif [ ! -w $IPFILE ]; then LOGTEXT="IP file is not writable." LOGDATE="[$(date +'%d.%m.%Y %H:%M:%S')]" echo "$LOGDATE $LOGTEXT" >> $LOGFILE exit 1 fi
# IP Validator # http://www.linuxjournal.com/content/validating-ip-address-bash-script function validate_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then OIFS=$IFS IFS='.' ip=($ip) IFS=$OIFS [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] stat=$? fi return $stat }
GET_IP_URLS=( "http://icanhazip.com" "https://api.ipify.org" "http://wtfismyip.com/text" "http://nst.sourceforge.net/nst/tools/ip.php" ) for key in ${!GET_IP_URLS[@]}; do NEWIP=$(curl -s ${GET_IP_URLS[$key]} | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}') if validate_ip $NEWIP; then break elif [ $key -eq $((${#GET_IP_URLS[@]} - 1)) ]; then LOGTEXT="Could not find current IP. Offline?" LOGDATE="[$(date +'%d.%m.%Y %H:%M:%S')]" echo "$LOGDATE $LOGTEXT" >> $LOGFILE exit 1 else LOGTEXT="Got a non-valid IP from ${GET_IP_URLS[$key]}." LOGDATE="[$(date +'%d.%m.%Y %H:%M:%S')]" echo "$LOGDATE $LOGTEXT" >> $LOGFILE fi done
STOREDIP=$(cat $IPFILE)
if [ "$NEWIP" != "$STOREDIP" ]; then RESPONSE=$(curl -s -k -u $USERNAME:$PASSWORD --user-agent "$USERAGENT" "https://dynupdate.no-ip.com/nic/update?hostname=$HOST&myip=$NEWIP") RESPONSE=$(echo $RESPONSE | tr -cd "[:print:]") RESPONSE_A=$(echo $RESPONSE | awk '{ print $1 }') case $RESPONSE_A in "good") RESPONSE_B=$(echo $RESPONSE | awk '{ print $2 }') LOGTEXT="(good) DNS hostname(s) successfully updated to $RESPONSE_B." ;; "nochg") RESPONSE_B=$(echo $RESPONSE | awk '{ print $2 }') LOGTEXT="(nochg) IP address is current: $RESPONSE_B; no update performed." ;; "nohost") LOGTEXT="(nohost) Hostname supplied does not exist under specified account. Revise config file." ;; "badauth") LOGTEXT="(badauth) Invalid username password combination." ;; "badagent") LOGTEXT="(badagent) Client disabled - No-IP is no longer allowing requests from this update script." ;; "!donator") LOGTEXT="(!donator) An update request was sent including a feature that is not available." ;; "abuse") LOGTEXT="(abuse) Username is blocked due to abuse." ;; "911") LOGTEXT="(911) A fatal error on our side such as a database outage. Retry the update in no sooner than 30 minutes." ;; *) LOGTEXT="(error) Could not understand the response from No-IP. The DNS update server may be down." ;; esac echo $NEWIP > $IPFILE LOGDATE="[$(date +'%d.%m.%Y %H:%M:%S')]" echo "$LOGDATE $LOGTEXT" >> $LOGFILE fi exit 0

 

Cronjob

Damit das Bash-Script in regelmäßigen Intervallen ausgefüht wird, muss noch ein Cronjob angelegt werden. Dazu bearbeiten wir die crontab:

$ sudo nano /etc/crontab

Ganz unten wird einfach folgender Eintrag hinzugefügt und die Änderung an der Crontab gespeichert:

# NO-IP update
*/5 *   * * *   root    /usr/local/bin/noip_updater.sh

Anschließend den Cron-Service neustarten – fertig!

$ sudo service cron restart

Dieser Artikel war hilfreich für dich?
Bitte unterstütze Datenreise.de - Danke!

Spenden

Artikel bewerten:
1 Star2 Stars3 Stars4 Stars5 Stars
4,82/5 (11 Bewertungen)

Bash: Update-Script für NO-IP.com (DynDNS) 4,82 out of 5 based on 11 ratings
Loading...