Come ottenere la posizione geografica del sistema da uno script Bash

È possibile determinare la posizione geografica di un sistema Linux remoto sfruttando API pubbliche e uno script bash semplice. La geolocalizzazione di un server può facilitare la sua identificazione nel mondo fisico, garantendo che i server siano posizionati in aree strategiche.

Ogni server connesso a Internet possiede un indirizzo IP pubblico, assegnato direttamente al server o a un router che indirizza il traffico verso quel server. Gli indirizzi IP forniscono indicazioni sulla posizione approssimativa del server a livello globale. I dati di geolocalizzazione possono essere ottenuti tramite due API aperte, fornite da ipinfo.co e IP Vigilante, permettendo di identificare la città, la regione e la nazione associate a un server o altro sistema remoto. È importante sottolineare che questa tecnica non fornisce una posizione GPS precisa, ma piuttosto una stima dell’area generale in cui si trova l’indirizzo IP.

Connessione a un sistema remoto

I seguenti comandi dovranno essere eseguiti sul server Linux o su altri sistemi remoti che si intende geolocalizzare. Pertanto, è necessario prima stabilire una connessione al server e accedere alla shell. Ad esempio, si può utilizzare SSH per la connessione. In alternativa, i comandi potrebbero essere eseguiti sul proprio sistema locale per determinarne la posizione, ma in genere la posizione del proprio sistema è già nota.

Installazione di curl e jq

Per interagire con le API di geolocalizzazione, sono necessari due strumenti: curl, che permette di effettuare richieste HTTP, e jq, che consente di elaborare i dati JSON restituiti. Aprire un terminale e utilizzare apt-get per installare questi strumenti su sistemi basati su Ubuntu o Debian. Per altre distribuzioni Linux, utilizzare il gestore di pacchetti specifico della propria distribuzione.

sudo apt-get install curl jq

Individuazione dell’indirizzo IP pubblico del server

Prima di poter acquisire i dati di geolocalizzazione, è necessario conoscere l’indirizzo IP pubblico del server. Utilizzare curl per effettuare una chiamata API a ipinfo.io all’interno della finestra del terminale.

curl https://ipinfo.io/ip

Acquisizione dei dati di posizione tramite API

Una volta ottenuto l’indirizzo IP pubblico del server, è possibile effettuare una richiesta all’API di ipvigilante.com per recuperare i dati di geolocalizzazione. Sostituire con l’indirizzo IP restituito dal comando precedente.

curl https://ipvigilante.com/

Analizziamo più nel dettaglio quali dati vengono restituiti da questa chiamata:

L’API fornisce informazioni sulla città, il paese e il continente in cui si trova il server. Inoltre, vengono fornite le coordinate approssimative di latitudine e longitudine, utili per visualizzare il server su una mappa interattiva. Nello script, verranno utilizzati i campi “latitude”, “longitude”, “city_name” e “country_name”. Il comando jq è in grado di elaborare i dati API ed estrarre questi quattro campi specifici.

Creazione di uno script per l’automazione della chiamata API

È possibile creare uno script che recuperi i dati di geolocalizzazione e li scriva in un file in formato CSV. I dati saranno salvati in un file denominato server_location.txt nella directory /tmp/. Aprire il proprio editor preferito e creare uno script chiamato geolocate.sh. Inserire il contenuto dello script riportato di seguito, avendo cura di sostituire l’indirizzo IP con quello appropriato:

#!/bin/sh
OUTPUT_FILE=/tmp/server_location.txt

# Recupera l'indirizzo IP pubblico del server
PUBLIC_IP=`curl -s https://ipinfo.io/ip`

# Chiama l'API di geolocalizzazione e cattura l'output
curl -s https://ipvigilante.com/${PUBLIC_IP} |
        jq '.data.latitude, .data.longitude, .data.city_name, .data.country_name' |
        while read -r LATITUDE; do
                read -r LONGITUDE
                read -r CITY
                read -r COUNTRY
                echo "${LATITUDE},${LONGITUDE},${CITY},${COUNTRY}" |
                        tr --delete " >
                        ${OUTPUT_FILE}
        done

Salvare lo script e tornare al terminale. Rendere lo script eseguibile, concedendo i permessi di esecuzione sul file:

chmod u+x geolocate.sh

Ora è possibile provare lo script. Eseguire geolocate.sh e verificare il contenuto del file di output:

./geolocate.sh
cat /tmp/server_location.txt

Aggiornamento giornaliero dei dati di geolocalizzazione tramite Cron Job

Configurare un cron job per aggiornare quotidianamente la geolocalizzazione del server e salvare i dati in un file. Il cron job giornaliero aggiornerà un file denominato server_location.txt nella cartella /tmp/ del server. Creare un cron job che venga eseguito ogni 24 ore è semplice come copiare lo script nella directory /etc/cron.daily. È necessario utilizzare il comando sudo per copiare il file come utente root ed evitare problemi di permessi. Eseguire il comando seguente per copiare geolocate.sh nella directory /etc/cron.daily:

sudo cp geolocate.sh /etc/cron.daily

Queste modifiche hanno effetto immediato, e lo script verrà eseguito ogni 24 ore per aggiornare il contenuto del file /tmp/server_location.txt. Questi dati possono essere utilizzati per scopi diversi, ad esempio, tracciare la posizione dei server su una mappa o combinare la geolocalizzazione con i log del traffico per identificare i punti caldi dei server a livello globale.