Script per ottenere il proprio IP pubblico via Telegram ogni volta che viene aggiornato

Se siete un po’ nerd e avete in casa o in ufficio un server al quale dovete poter accedere (magari da un terminale remoto con ssh) saprete che spesso il proprio internet provider non garantisce un IP pubblico fisso (se non a pagamento) e questo può rivelarsi un problema, ecco perché ho pensato ad un semplice script automatico che può essere d’aiuto.

Premetto che ci sono diversi modi per ottenere lo stesso risultato, come ad esempio passare da un servizio di DDNS in grado di aggirare anche il problema delle reti nattate, ma io sono più “vecchio stile” e preferisco avere tutto sotto controllo senza dipendere da nessuno.

Ma perché uno script? Perchè funziona a prescindere; è il livello più basso del sistema e anche se altri servizi dovessero crashare la bash dovrebbe essere una garanzia (quasi sempre).

E perché Telegram? Per lo stesso motivo; l’invio di una notifica a Telegram dipende unicamente da una chiamata http tramite curl.

Personalmente posseggo un piccolo server casalingo che si occupa di gestire la domotica e alcuni altri servizi, per precisa scelta ho optato per un’installazione su Ubuntu Server con tutti i servizi extra in Docker, questo dovrebbe garantirmi che anche se uno di questi dovesse crashare o non avviarsi per i motivi più disparati, il sistema dovrebbe essere in grando di andare up senza problemi.

Questo script è solo una funziona di backup, utilizzo un tunnel Cloudflare per la domotica e un bot Telegram in grado di inviarmi l’IP in ogni momento, ma come detto in precedenza, tutto questo dipende da altri servizi che devono avviarsi ed essere disponibili, cosa non così scontata.

Per fare ciò a cui ambisce questa guida avrete bisogno di:

  • 1 Bot Telegram
  • il vostro chat_id Telegram
  • 1 terminale (locale o remoto con ssh è indifferente)
  • curl installato
  • 1 connessione ad internet

Creare un Bot Telegram è una procedura ormai abbastanza semplice ma se ne avete uno già attivo potete tranquillamente utlizzare quello. Comunque ecco i passi salienti:

  • aprite Telegram e cercate un bot chiamato @BotFather
  • avviatelo e selezionate dal menu “create a new bot
  • seguite le istruzioni inserendo le informazioni richieste e segnatevi il Token che vi viene fornito al termine e che dovrebbe essere qualcosa di simile a: 1234567890:AbCdefghaILmHngF (eventualmente può essere recuperato in un secondo momento)

Per recuperare il chat_id vi consiglio di aprire Telegram, cercare un bot che si chiama @GetMyChatID_Bot e avviarlo, troverete immediatamente il vostro chat_id che dovrete segnarvi da parte insieme al token visto in precedenza.

Ora aprite un terminale sul pc che vi interessa (in locale o tramite ssh è indifferente), e cominciate a creare il file di testo dove memorizzare il vostro ip pubblico, io ho scelto di salvarlo nella mia home ma non è vincolante. Dal terminale digitate:

touch /home/username/pubblic_ip.txt

Ora non resta che passare allo script vero e proprio, anche questo può essere memorizzato in qualsiasi posizione, io sono rimasto nella home:

nano /home/username/ip_notifier.sh

Nell’editor di testo che appare incollate il seguente codice:

#!/bin/bash
# Script to report public IP address change

ext_ip="/home/username/pubblic_ip.txt"

# Forza IPv4 con -4, con fallback su altri servizi
new_ip=$(curl -4 --max-time 10 -s http://ifconfig.me/ip 2>/dev/null || \
         curl -4 --max-time 10 -s https://ipv4.icanhazip.com 2>/dev/null || \
         curl -4 --max-time 10 -s https://api4.my-ip.io/ip 2>/dev/null)

# Rimuove eventuali spazi/newline residui
new_ip=$(echo "$new_ip" | tr -d '[:space:]')

# Verifica che sia un IPv4 valido (sanity check)
if ! echo "$new_ip" | grep -qE '^([0-9]{1,3}\.){3}[0-9]{1,3}$'; then
    echo "$(date): IP non valido ottenuto: $new_ip" >> /home/username/ip_errors.log
    exit 1
fi

if [ -f "$ext_ip" ]; then
    know_ip=$(cat "$ext_ip")
else
    know_ip=""
fi

if [ "$new_ip" != "$know_ip" ]; then
    echo "$new_ip" > "$ext_ip"
    curl -s -X GET "https://api.telegram.org/bot<TOKEN>/sendMessage?chat_id=<CHAT_ID>&text=Nuovo+IP:+$new_ip"
fi

ovviamente dovrete motificare i valori di ext_ip e quelli relativi al token e chat_id di Telegram inserendo i vostri.

Ora bisogna renderlo eseguibile:

chmod +x /home/username/ip_notifier.sh

Finito, adesso ogni volta che verrà eseguito lo script, se ci sarà una variazione dell’IP pubblico, il sistema inviarà una notifica con il nuovo valore direttamente su Telegram.

Per rendere il tutto automatico, io ho scelto di impostare crontab perchè esegua in autonomia lo script ogni 3 ore, che è per me un tempo ragionevole di “vuoto” in caso di problemi.

Come ogni cosa in informatica, il limite è solo la propria fantasia.

Alessandro Salgoni
Alessandro Salgoni
4.5 2 voti
Valutazione Articolo
Sottoscrivi
Notificami
guest
9 Commenti
Vecchi
Nuovi Più votati
Feedback in linea
Visualizza tutti i commenti
Lorenzo

Ottima soluzione con probemi per farla funzionare ( scarso di Linux ) Help me

Lorenzo

ciao bot ok ma pare che non memorizzi l IP nella $new_ip, e lancio questo new_ip=$(curl http://ifconfig.me/ip) lo vedo ma poi ….ce modo di vedere se rimane nella cella ??

Lorenzo

tutto OK piano piano si impara, poi battendo il naso entra meglio e rimane piu a lungo per la prossima volta
Grazie spero di provarlo meglio nel whekend
Saluti

Lorenzo
  • Ciao , era fantastico funzionava e funziona ancora adesso, però da circa una 20 di giorni il Provider Voda mi sta mandando come prioritario IPV6 e new_ip=$(curl http://ifconfig.me/ip) mi cattura la la stringa ….2×01:x27:1×82:5×00——–:………..che a parte la lunghezza non posso usarla perchè NON è uguale a quella che mi presenta il Router a display

Versione Firmware: XF6_4.0.06.09
Indirizzo WAN IPv4: xx.x5x.xx5.xx
Indirizzo WAN IPv6: 2×01:x27:5×13:8×58::x
Come si potrebbe risolvere ?
io se metto quello a web sia IPV4 che IPV6 entro nel sistema remoto con l’altro inviato al BOT no.
Ho gia cercato di troncare la stringa con info lette in giro ma essendo diversi i numeri non funzionerà mai …
.
quando una cosa funziona bisogna smontarla altrimenti ci annoiamo ……
tnx

Lorenzo

Ciao ti ringrazio
lo sto provando ma ce qualche problema
bash: ./ip_notifier.sh: /bin/bash^M: bad interpreter: No such file or directory
non riesco a capire lo installo su un Pzero non ho adesso a disposizione un rp3b altrimenti avrei provato
Hai idea ??
tnx

Lorenzo

Ciao, ho dovuto creare ip_notifica.sh nuovo nome e si è sistemato tutto , non ne voleva sapere di funzionare, meglio così
Grazie ottima soluzione che speriamo duri anni.
Io un pezzo alla volta mi inietto un po di comandi nuovi, non è cosi facile districarsi
lunga vita a Linux