ubuntuusers.de

Wie kann ich zwei dyndns-updatescrips vereinen?

Status: Gelöst | Ubuntu-Version: Server 24.04 (Noble Numbat)
Antworten |

Reihner

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

Hallo ihr (und auch du da in der Ecke),

wie die Überschrift es schon sagt möchte ich zwei "einfache" Updatescripts, für meine DynDNS-Addresse bei ddnss.de vereinen. Da meine shell-Kenntnisse mit "praktisch nicht vorhanden" euphemistisch großzügig beschreiben sind und ich schon KI-tools nutzen musste um die einzelnen Scripts hinzubekommen übersteigt das verschmelzen beider Scripts meine Fähigkeiten.

Script1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
KEYAUTH="key hier eintragen"
HOSTNAME="domain.ddnss.de"
PFAD="/home/username"
# ALLHOST="all" # Alternativ Hostname
DATUM=`date +%Y-%m-%d\ %H:%M:%S`
IP=`wget -q -O - https://ip4.ddnss.de/meineip.php| grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`
UPDIP=`cat $PFAD/updip4.txt`
echo "Aktuelle IP=$UPDIP"
if [ "$IP" == "$UPDIP" ]; then
echo "$DATUM - $IP ; IP ist gleich - KEIN UPDATE" >> $PFAD/log4.txt
else
echo "$DATUM - Neue-IP: $ip / Alte-IP: $UPDIP - UPDATE!" >> $PFAD/log4.txt
echo $IP > $PFAD/updip4.txt
wget -q -O - 'https://ip4.ddnss.de/upd.php?key='$KEYAUTH'&host='$HOSTNAME''>> $PFAD/log4.txt
# wget -q -O - 'https://ip4.ddnss.de/upd.php?key='$KEYAUTH'&host='$ALLHOST''>> $PFAD/log4.txt
echo " " >> $PFAD/log4.txt
echo "Update ..."
fi

Script2

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
KEYAUTH="key hier eintragen"
HOSTNAME="domain.ddnss.de"
PFAD="/home/username"
# ALLHOST="all" # Alternativ Hostname
DATUM=`date +%Y-%m-%d\ %H:%M:%S`
IP=`wget -q -O - https://ip6.ddnss.de/meineip.php| grep -o -E '([0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}'`
UPDIP=`cat $PFAD/updip6.txt`
echo "Aktuelle IP=$UPDIP"
if [ "$IP" == "$UPDIP" ]; then
echo "$DATUM - $IP ; IP ist gleich - KEIN UPDATE" >> $PFAD/log6.txt
else
echo "$DATUM - Neue-IP: $ip / Alte-IP: $UPDIP - UPDATE!" >> $PFAD/log6.txt
echo $IP > $PFAD/updip6.txt
wget -q -O - 'https://ip6.ddnss.de/upd.php?key='$KEYAUTH'&host='$HOSTNAME''>> $PFAD/log6.txt
# wget -q -O - 'https://ip6.ddnss.de/upd.php?key='$KEYAUTH'&host='$ALLHOST''>> $PFAD/log6.txt
echo " " >> $PFAD/log6.txt
echo "Update ..."
fi

Final müsste in Zeile 15 so etwas wie

https://www.ddnss.de/upd.php?key='$KEYAUTH'&host='$HOSTNAME'&ip=<ipaddr>&ip6=<ip6addr>

stehen ... vermute ich zumindest.

Ich habe da wohl den falschen Denkansatz, könnte mir jemand helfen?

Der Anbieter selbst konnte mir in diesem Zusammenhang nicht weiterhelfen.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

Also, ich habe deine Skripte nur überflogen und wenn ich es richtig verstehe, willst du IPv4 & IPv6 updaten?! Ich habe sowas ähnliches bei desec.io laufen mit meinen eigenen Domains. Dort habe ich mit der api die Möglichkeit entweder IPv4 oder IPv6 oder beides upzudaten, das ganze mache ich mit curl, entsprechend mache ich das mit if Bedingungen, ich werde jetzt nicht dein Skript hier für dich anpassen, aber du kannst dir gerne mal das anschauen https://github.com/micneu72/deSEC-DNS-Updater-BASH alternativ habe ich auch eine Version mit python3 und pushover benachrichtigung

Reihner

(Themenstarter)

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

micneu schrieb:

Also, ich habe deine Skripte nur überflogen und wenn ich es richtig verstehe, willst du IPv4 & IPv6 updaten?!

Nicht nur. Zudem soll noch:

  • protokolliert werden wie sich die einzelnen IP´s (IPv4 und IPv6) im Laufe der Zeit verändern,

  • protokolliert werden was der Prompt antwortet,

  • nur ein Update gesendet werden wenn eine Änderung aufgetreten ist.

Ich habe das Script von micneu72, was du verlinkt hast, angepasst und ausprobiert. Es funktioniert zwar, dauert manchmal aber sehr lange:

Hostname: domain.ddnss.de
Fehler: Weder 'drill' noch 'host' sind verfügbar.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    12  100    12    0     0    123      0 --:--:-- --:--:-- --:--:--   125
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    33  100    33    0     0    298      0 --:--:-- --:--:-- --:--:--   300
IPv4: XXX.XXX.XXX.11
IPv6: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:bbb6
Die IPs haben sich geändert oder eine davon. Verarbeitung starten.
Beide IPs sind verfügbar: IPv4 = 'XXX.XXX.XXX.11', IPv6 = 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:bbb6'
<head>
<meta name="robots" content="noindex">
<title>DDNSS - Kostenloser DynDNS Service : Re-ProutDNS v5.01v</title>
</head>
<body>
<p><font face="Verdana" size="2"></font></p>
<p><font face="Verdana" size="2">Updated 1 hostname.</font></p>
</body>


Laufzeit: 2 Minuten, 1 Sekunden

ein anderes mal ist es hingegen aber schnell:

Hostname: domain.ddnss.de
Fehler: Weder 'drill' noch 'host' sind verfügbar.
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    12  100    12    0     0    113      0 --:--:-- --:--:-- --:--:--   114
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100    33  100    33    0     0    299      0 --:--:-- --:--:-- --:--:--   302
IPv4: XXX.XXX.XXX.11
IPv6: XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:bbb6
Die IPs haben sich geändert oder eine davon. Verarbeitung starten.
Beide IPs sind verfügbar: IPv4 = 'XXX.XXX.XXX.11', IPv6 = 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:bbb6'
<head>
<meta name="robots" content="noindex">
<title>DDNSS - Kostenloser DynDNS Service : Re-ProutDNS v5.01v</title>
</head>
<body>
<p><font face="Verdana" size="2"></font></p>
<p><font face="Verdana" size="2">Updated 1 hostname.</font></p>
</body>


Laufzeit: 0 Sekunden

Das Script funktioniert soweit erst einmal. Danke.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

Ok, super dann musst du dir nur noch die fehlenden Funktionen in das Skript einbauen, ich habe gesehen das auf deinem System kein drill oder Host Befehl fehlt, aber es scheint ja auch so bei dir zu gehen. Ist es jetzt gelöst?

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

micneu schrieb:

... drill oder Host Befehl fehlt, ...

BTW: Diese tools können mit:

sudo apt install ldnsutils bind9-host

installiert werden.

which drill host

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

Ich habe auf allen Systemen „dnsutils“ bis auf die alpine Systeme

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

kann gelöscht werden

lubux

Anmeldungsdatum:
21. November 2012

Beiträge: 14314

micneu schrieb:

... „dnsutils“ ...

Ja, ist auch OK bzw. ein Übergangspaket:

Transitional package for bind9-dnsutils

Reihner

(Themenstarter)

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

micneu schrieb:

... Ist es jetzt gelöst?

Prinzipiell "ja", wenngleich es noch das Problem gibt, dass das Script jedes mal, wenn es ausgeführt wird, ein Update macht. Das könnte ärger mit dem Anbieter geben wenn alle paar Minuten ein Update ohne neue Informationen kommt. Andererseits besteht bei einem zu großen Updateintervall die Gefahr das meine Dienst einige Zeit (zu lange) nicht erreichbar sind.

micneu schrieb:

... dann musst du dir nur noch die fehlenden Funktionen in das Skript einbauen ...

Wie, weiter oben schon, erwähnt, übersteigt das meine Fähigkeiten.

micneu schrieb:

... ich habe gesehen das auf deinem System kein drill oder Host Befehl fehlt ...

Wie heisen die Pakete dazu?

lubux schrieb:

BTW: Diese tools können mit:

sudo apt install ldnsutils bind9-host

installiert werden.

ich ziehe die Frage zurück

lubux schrieb:

micneu schrieb:

... „dnsutils“ ...

Ja, ist auch OK bzw. ein Übergangspaket:

Transitional package for bind9-dnsutils

Werde ich mir mal ansehen, vielleicht klappt es damit besser.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

@Reihner ich kenne deinen dyndns Anbieter nicht, wenn der eine api hat kannst du die ja auch abfragen, um den aktuellen eintrag auszulesen, ein mögliches vorgehen (was ich für meine python version überlege)

  • Abfrage der api, abfragen, ob der dns vorhanden ist und welche ip eingetragen ist

  • bei ungleichen ips diesen aktualisieren oder bei fehlendem Eintrag

  • das für IPv4 & IPv6

Warum ich sowas für die Python Version machen würde, ist da ich direkt mit dem json arbeiten kann (dictonary)

PS: was willst du mit den logs, werden die elektronisch weiterverarbeitet oder willst du dir das nur anschauen können?

Reihner

(Themenstarter)

Anmeldungsdatum:
14. Juni 2017

Beiträge: 168

Wohnort: Klendathu

Das Script von micneu72 macht bei mir doch Probleme. ddnss.de erlaubt nur 60 IP-updates pro Tag.

Ich habe nach einiger Suche ein "uraltes" Script von M0ses (wieder)gefunden und leicht angepasst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash

WORKING_DIR="/home/ich/ddnss-update/"
LOG_FILE=/home/ich/ddnss-update/update.log
KEYAUTH="123456"
HOSTNAME="meine.ddnss.de"

# set default loglevel
LOGLEVEL=3

if [ -z "$FORCE_UPDATE" ];then
  FORCE_UPDATE=86400
fi

function logmsg {
  LL=$1
  shift
  [ "$LL" -le "$LOGLEVEL" ] && echo "$CURRENT_DATE - $@" >> $LOG_FILE
}

CURRENT_DATE=`date +%Y-%m-%d\ %H:%M:%S`

IP6=`curl https://ip6.ddnss.de/meineip.php 2>/dev/null| grep -o '[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}\:[0-9a-z]\{1,4\}'`
IP=`curl https://ip4.ddnss.de/meineip.php 2>/dev/null| grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'`

UPDIP=`cat $WORKING_DIR/ip4.last 2>/dev/null||echo -en ''`
UPDIP6=`cat $WORKING_DIR/ip6.last 2>/dev/null||echo -en ''`

logmsg 5 "Current IP=$UPDIP"
logmsg 5 "Current IP=$UPDIP6"

NOW=`date +%s`
LAST_UPDATE=`stat -c %Y $WORKING_DIR/ip4.last`
NEXT_UPDATE=$(( $LAST_UPDATE + $FORCE_UPDATE ))

[ $NOW -lt $NEXT_UPDATE ]
UPDATE_NOW=$?

[ "$IP" == "$UPDIP" -a "$IP6" == "$UPDIP6" ]
IP_SAME=$?

if [ $IP_SAME == 0 -a $UPDATE_NOW == 0 ]; then

   logmsg 4 "IP is the same - NO UPDATE"

else
   logmsg 5 "New IP: $IP / Old IP: $UPDIP - UPDATE!"
   logmsg 5 "New IP6: $IP6 / Old IP6: $UPDIP6 - UPDATE!"

   echo $IP > $WORKING_DIR/ip4.last
   echo $IP6 > $WORKING_DIR/ip6.last
   CMD="curl -v https://www.ddnss.de/upd.php?key=$KEYAUTH&host=$HOSTNAME&ip=$IP&ip6=$IP6"
   logmsg 5 "COMMAND: $CMD"
   HTTP=`$CMD 2>&1`
   FOUND=`echo "$HTTP"|grep "DDNSS-Response: good"`
   if [ -n "$FOUND" ];then
     logmsg 4 "Update ... (IPv4=$IP/IPv6=$IP6)"
   else
     logmsg 1 "Something went wrong: $HTTP"
   fi
fi

Das sollte nun seine Funktion erfüllen, auch wenn der Updateverlauf noch nicht so funktioniert wie er soll.

micneu

Avatar von micneu

Anmeldungsdatum:
19. Januar 2021

Beiträge: 758

Wohnort: Hamburg

@Reihner danke, dein für deinen Hinweis das ich einen Fehler in meinem Skript hatte. Nach dem ich diesen behoben hatte, habe ich noch mal mir dein Problem angeschaut, ich habe für deinen Dyndns Anbieter mal eine python3 variante probiert, ja das ist möglich. Ich gebe dir einen tipp, prüfe nicht auf code 200, da habe ich ein wenig für gebraucht. Bei mir läuft es!

./ddnss-updater.py
2025-04-25 22:26:44 - INFO - Hostname: blabla.ddnss.de
2025-04-25 22:26:44 - INFO - dnsIPv4: yy.yy.yy.yy, dnsIPv6: gexxt
2025-04-25 22:26:44 - INFO - wanIPv4: yy.yy.yy.yy, wanIPv6: gexxt
2025-04-25 22:26:44 - INFO - Keine IP-Änderungen. Keine Aktion nötig.
2025-04-25 22:26:44 - INFO -
Runtime: 0 seconds
Antworten |