DynDNS Updater (Debian / 10.07.2024)
Der DynDNS Updater aktualisiert eine DynDNS-Domain mit der aktuellen IP-Adresse.
Wenn das Script zum ersten Mal ausgeführt wird, muss man die API zur Aktualisierung eingeben, die dieses Script dann aufruft.
Diese API wird dann im script-data-Ordner gespeichert.
Genaue Zusammenfassung:
data=/home/$USER/script-data/$0
Wenn noch keine IP vorhanden ist ($data/ip.txt), dann wird die IP-Adresse von "icanhazip.com" abgerufen.
API wird aufgerufen, IP wurde aktualisiert.
Jeder Schritt wird mitgeloggt in $data/allgemein.csv (besondere Ereignisse), tagesaktuell in $data/logs/YYYYMMTT.csv (Updates).
🧾 Was macht das Script?
📁 Lade bisherigen Status:
-
Wenn
ip.txt
vorhanden ist, wird die bisherige öffentliche IP geladen. -
Wenn nicht: → erste Ausführung → IP bleibt leer, Log-Eintrag in
allgemein.csv
.
🌐 Prüfe Update-URL:
-
Wenn
updateurl.txt
existiert → lese erste Zeile ein. -
Wenn nicht vorhanden:
-
Benutzer wird zur Eingabe einer gültigen
http(s)
-URL aufgefordert. -
Wenn gültig: speichere in
updateurl.txt
& logge es. -
Wenn ungültig: Abbruch & Fehlerlog.
-
📶 Online-Check:
-
Ping an
icanhazip.com
(IPv4, 1 Paket, Timeout 3s) -
Wenn erreichbar:
-
Hole neue IP mit
curl
-
Vergleiche mit vorheriger IP
-
Unverändert: nur Statusmeldung
-
Geändert:
-
speichere neue IP in
ip.txt
-
rufe
updateurl
auf (z. B. DynDNS-Anbieter) -
logge Aktualisierung in Tageslog
-
sende E-Mail-Benachrichtigung
-
-
-
-
Wenn nicht online:
-
logge, dass keine Aktualisierung möglich ist
-
📬 Benötigte Tools:
-
curl
-
ping
-
mail
-
sed
,head
,tail
-
Bash >= 4
Inhalt der $data/updateurl.txt:
https://api.dyndns.tld/update.php?key=q12w3e4r5t6z7u8i9o0p
Script:
user=$(whoami)
data="/home/$user/script-data/$(basename "$0")"
ippage="icanhazip.com"
if [ ! -d "$data" ]; then
mkdir -p "$data"
fi
if [ ! -d "$data/logs" ]; then
mkdir "$data/logs"
fi
function ipcheck {
echo "$(date +"[%d.%m.%Y %H:%M:%S]")"
if [ -f "$data/ip.txt" ]; then
ip=$(head -n1 "$data/ip.txt")
echo "Bisherige IP: $ip"
else
echo "Erste Ausführung."
ip=""
echo "$(date +"%d.%m.%Y;%H:%M:%S");Erste Ausführung;$1" >> "$data/logs/allgemein.csv"
fi
if [ -f "$data/updateurl.txt" ]; then
updateurl=$(sed 's/ //g' "$data/updateurl.txt" | head -n1 | tail -n1)
else
echo "Keine Update-URL hinterlegt. URL hier einfügen:"
echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL fehlt" >> "$data/logs/allgemein.csv"
read -p "Update-URL: " updateurl
# Überprüfe, ob die URL mit "http://" oder "https://" beginnt
if [[ "$updateurl" =~ ^(http|https):// ]]; then
echo "URL OK."
echo "$updateurl" > "$data/updateurl.txt"
echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL hinterlegt;$1" >> "$data/logs/allgemein.csv"
else
echo "Die URL ist ungültig."
echo "$(date +"%d.%m.%Y;%H:%M:%S");Update-URL ungültig;$1" >> "$data/logs/allgemein.csv"
exit 1
fi
fi
echo "Prüfe Online-Status"
if ping -4 -c 1 -W 3 "$ippage" >/dev/null 2>&1; then
echo "Anschluss Online"
ipneu=$(curl -s "$ippage")
echo "IP: $ipneu"
if [ "$ip" = "$ipneu" ]; then
echo "IP unverändert."
# echo "$(date +"%d.%m.%Y;%H:%M:%S");IP unverändert;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
else
echo "Bisherige IP: $ip"
echo "Neue IP : $ipneu"
echo "Aktualisiere..."
echo "$ipneu" > "$data/ip.txt"
curl -sSL "$updateurl" >/dev/null
echo "OK."
echo "$(date +"%d.%m.%Y;%H:%M:%S");Aktualisiert auf $ipneu;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
echo "$(date +"[%d.%m.%Y %H:%M:%S]") IP aktualisiert auf $ipneu" | mail -s "DynDNSupdater" "mail@mariobeh.de"
fi
else
echo "Client ist selbst offline, kein Aktualisieren möglich."
echo "$(date +"%d.%m.%Y;%H:%M:%S");Client offline;$1" >> "$data/logs/$(date +"%Y%m%d").csv"
fi
}
if [ -z "$1" ]; then
ipcheck
fi
exit 0