Benachrichtigung bei Änderung der IP-Adresse per Mail

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Im Forum

    http://raspberrypi.org/forums/viewtopic.php?t=65010

    ist ein Script beschrieben, mit dem bei Änderung der ext. IP Adresse eine Mail verschickt wird.

    Script siehe Anhang.

    Das eigentliche Script (siehe Anhang) ip-sender.sh wurde ausführbar gemacht mit chmod +x test.sh

    Habe folgende Schritte gemacht:

    update package list, mailutils und ssmtp installiert

    EDITIERT WURDE DANN sudo nano /etc/ssmtp/ssmtp.conf

    root=MAILADRESSE

    mailhub=smtp.SERVER:587

    hostname=raspberry

    UseTLS=Yes

    UseSTARTTLS=Yes

    AuthUser=MAILADRESSE

    AuthPass=PASSWORT

    FromLineOverride=NO

    EDITIERT AUCH:

    sudo nano /etc/ssmtp/revaliases

    Am Ende des Scripts folgendes eingefügt:

    root:meinemail:smtp.SERVER.com:587

    benutzer:meinemail:smtp.SERVER.com:587


    Laut Anleitung müsste das Script beim ersten Start eine Fehlermeldung bringen, weil keine Datei ip.txt existiert. Die kommt auch.

    Beim 2. Aufruf sollte eine ip.txt geschrieben werden, passiert aber nicht. Stattdessen kommt die Fehlermeldung: Es existiert keine Datei ip.txt. Weitere Aufrufe bringen dieselbe Fehlermeldung.

    Beim Wechsel der externen IP Adresse wird aber keine Adresse in die ip.txt geschrieben.

    Test von mir:

    Erstelle selbst die ip.txt Datei.

    Trage eine externe IP Adresse ein und rufe das Script auf: sh ip-sender.sh

    Die eingetragene IP Adresse wird gelöscht, aber keine aktuelle reingeschrieben.

    Beim manuellen Aufruf des Scripts wird auch keine Mail verschickt. sh ip-sender.sh

    Fehlermeldung kommt auch keine, nur wieder die leere Kommandozeile.

    Der Versand einer Mail über

    echo TESTMAIL | mail -s "ssmtp Test Email" yourname@yourdomain.com

    funktioniert.

    Hat hier jemand eine Idee, woran es liegen könnte? Die Syntax von Script ist ja in Ordnung.

    Thx schon mal.

  • Benachrichtigung bei Änderung der IP-Adresse per Mail? Schau mal ob du hier fündig wirst!

  • Laut Anleitung müsste das Script beim ersten Start eine Fehlermeldung bringen,

    Hat hier jemand eine Idee, woran es liegen könnte? Die Syntax von Script ist ja in Ordnung.

    Alternativen für:

    Code
    wget -qO- ifconfig.me/ip

    aus dem Script.

    Code
    wget -qO - http://myip.dnsomatic.com/ 2> /dev/null
    curl ipinfo.io/ip
    dig +short myip.opendns.com @208.67.222.222
    telnet 4.ifcfg.me 2>&1 | grep IPv4 | cut -d' ' -f4
    curl -B4 http://checkip4.spdyn.de
    host -t A myip.opendns.com 208.67.222.222 | grep -i 'has address' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'
    stun -v stun.ekiga.net 2>&1 1>/dev/null | grep MappedAddress | sed -e 's/.*MappedAddress = //' -e 's/:.*//' | uniq
    curl -k -X GET http://checkip.two-dns.de 2>&1 | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}'

    (oder gleichwertig bzw. besser).

    Aus Gründen der Redundanz, das Script evtl. so modifizieren, dass mehrere bzw. unterschiedliche Abfragen möglich sind, falls ein Server nicht antwortet. Absolute Pfade im Script verwenden.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Thx schon mal an Hyle, Tell und besonders rpi444 - werde die Alternativen dann testen.

    Bei Gmail Nutzern muss nur im Account das Benutzen externer Apps aktiviert werden, dann geht's mit dem Script. Habe meinem Provider mal geschrieben, ob bei ihnen auch soetwas nötig ist.

    @ Hyle:

    Am Raspi als Benutzer wie im revaliases angegeben angemeldet.

    Dann Test von ip-sender.sh über die Kommandozeile mit sh ip-sender.sh

    Dauert ca. 2 Sekunden, dann kommt wieder die Kommandozeile, aber keine Mail geht raus und die ip.txt wird nicht beschrieben.

    Alle im 1. Post beschriebenen Schritte habe ich als "Benutzer" gemacht.

  • Soda,

    das 2. Script unten funzt jetzt - vielen Dank an rpi444 für den Tip.

    Gelegen hat's in dem Fall am letzten Teil der Zeile ip2=$(wget -qO - http://myip.dnsomatic.com/ 2> /dev/null)

    " 2> /dev/null" war noch nötig.

    Jetzt bin ich am Thema Redundanz dran.

    Es sollen also 4 Hosts angepingt werden. Wenn einer positiv ist, dann soll die neue IP Adresse in die Text Datei ip.txt geschrieben werden.

    Habe das Script in einem Online Script Tester getestet - keine Fehler wurden angezeigt.

    In der Praxis schaut's leider anders aus:

    Die ursprünglich geschriebene IP Adresse in der ip.txt Datei wird gelöscht und keine neue IP Adresse reingeschrieben.

    Wenn ich händisch eine fiktive Adresse eintrage, dann kommt nach der eingestellten Cronjob Zeit von 10 Minuten eine Mail mit der Meldung: Neue IP, aber der Body der Mail ist leer. Die neue IP Adresse wird also nicht eingetragen.

    Meine Fragen:

    1) Hat hier jemand eine Idee, wo es hakt?

    2) Die if then Zeilen wirken etwas hölzern, gibt es hier eine elegantere Variante nach dem Motto:

    Pinge Host 1 bis 4 an und wenn einer antwortet, dann schreibe die IP Adresse in $IP2.

    Vielen Dank schon mal.



    Script mit nur einer Pingquelle - dieses funktioniert. Die neue IP wird in die ip.txt geschrieben und dann per Mail im Body mitgeschickt.

  • Hey Raspiuser8716

    Ich hab das Script mal getestet. Die Variablen check1 bis check4 können alle nicht gesetzt werden daher wird auch keine IP in $ip2 geschrieben und daher überschreibt das Script den Inhalt von ip.txt mit der leeren Variable.

    Spoiler anzeigen

    ping: http://myip.dnsomatic.com: Der Name oder der Dienst ist nicht bekannt

    ping: http://ipinfo.io/ip: Der Name oder der Dienst ist nicht bekannt

    ping: http://checkip4.spdyn.de/: Der Name oder der Dienst ist nicht bekannt

    ping: http://checkip.two-dns.de: Der Name oder der Dienst ist nicht bekannt

    Wenn du die checks folgendermassen schreibst funktionieren die Pings aber die Ausgabe die du da erhälst ist nicht numerisch weshalb er die darauffolgenden If-Abfragen nie durchführt bzw mit false überspringt/abbricht oder wie man das richtig formuliert.

    Code
    check1=$(ping -c 1 myip.dnsomatic.com)
    check2=$(ping -c 1 ipinfo.io)
    check3=$(ping -c 1 checkip4.spdyn.de)
    check4=$(ping -c 1 checkip.two-dns.de)

    Ausgabe echo $check1

    Spoiler anzeigen

    PING updates.dnsomatic.com (67.215.92.215) 56(84) bytes of data. 64 bytes from 67.215.92.215 (67.215.92.215): icmp_seq=1 ttl=52 time=172 ms --- updates.dnsomatic.com ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 172.132/172.132/172.132/0.000 ms

    Im zweiten Script funktioniert das natürlich da du die IP-Abfrage nicht an einen Ping hängst sondern ohne Umwege direkt ausliest.

    Anstatt $ip2 mit den If-Abfragen 4 mal zu überschreiben wenn alle 4 Hosts online sind könntest du ja prüfen ob $ip2 beschrieben wurde. Wenn IP eingetragen und ungleich $ip1 dann senden sonst IP beim nächsten Host abfragen. Das ist aber nur meine Überlegung. Evt gings noch besser/einfacher.

    Beispiel:

    Bash
    if [ ip2== ]; then
        ip2=$(wget -qO - http://myip.dnsomatic.com/ 2> /dev/null)
        if [ ip2== ]; then
            ip2=$(......
        fi
    fi

    Grüsse Apop

    Ich suche nicht nach einer fertigen Lösung sondern nach dem Weg dahin ;)

    9 Mal editiert, zuletzt von Apop85 (24. Januar 2018 um 00:24)

  • Pinge Host 1 bis 4 an und wenn einer antwortet, dann schreibe die IP Adresse in $IP2.

    Pingen ist m. E. nicht gut. Teste ob die Hosts eine IP-Adresse liefern und wenn ja, vergleiche die gelieferte(n) IP-Adresse(n), mit der "alten" IP-Adresse. Von den 4 Hosts, sollte doch mind. einer immer in der Lage sein, deine richtige externe/öffentliche IPv4-Adresse zu liefern.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Finale - Hallelujah!!!

    Thx an rpi444 und besonders Apop85 - jetzt läuft's!!

    Hier der komplette funktionierende Code:


    Zugabe:

    Falls jemand mehrere Adressen im internen Netz überprüfen möchte, eignet sich das folgende Script gut:

    ACHTUNG: Bei Eingabe der Mail Adressen vor dem @ einen Backslash setzen, sonst kommt eine Fehlermeldung bzgl. Kompilierung.

    z.B. max.muster\@aon.de

    Man muss noch 2 Textdateien erstellen - meine heißen iptodo.txt und ipdone.txt.

    In die iptodo.txt die Namen der Hosts und die IP-Adresse untereinander eintragen. und zwar:

    HauptPC, 192.168.10.25

    VideoServer, 192.168.10.30

    usw.

    Das Script pingt dann die Adressen an und schreibt in die ipdone.txt dann die ganze Liste rein, mit einer Statusmeldung, ob erfolgreich oder fail.

    Dann noch einen Cronjob anlegen und zu den festgelegten Zeiten wird dann die Liste gemailt.


Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!