Esiste sicuramente un altro modo, ma ciò richiede la comprensione di ciò che accade effettivamente quando viene effettuata una richiesta su Internet. Quando visiti una pagina nel tuo browser web, i dati vengono trasferiti utilizzando un protocollo chiamato HTTP (sì, questo è il motivo per cui vedrai spesso http://
all'inizio degli URL).
HTTP è un protocollo basato su testo. Le informazioni vengono scambiate tra il client e il server inviando le intestazioni seguite dal corpo della richiesta. Le intestazioni contengono molte informazioni sullo stato della richiesta e delle informazioni da trasferire. L'intestazione che ti interesserà per aiutarti con il tuo problema non è proprio un'intestazione: è la prima riga trasferita e contiene un numero chiamato codice di stato. Questo numero è di 3 cifre e trasmette informazioni sullo stato. Se una richiesta ha esito positivo, il risultato è in genere 200 (non sempre - ci sono eccezioni).
Una cosa è certa: se il file richiesto non esiste sul server Web, il server dovrebbe rispondere con un codice di stato 404. Ciò indica che non è stato possibile trovare la risorsa. (Per i curiosi, ecco un elenco di codici di stato HTTP e il loro significato.)
Bene, abbastanza teoria. Vediamo come possiamo farlo sul terminale. Un ottimo strumento per recuperare richieste tramite HTTP che ci fornisce anche la possibilità di esaminare il codice di stato è cURL, che è disponibile nei repository di Ubuntu. Puoi installarlo con:
sudo apt-get install curl
Una volta installato, puoi invocarlo in questo modo:
curl [website]
... e il contenuto dell'URL specificato verrà stampato sul terminale. Queste sono le informazioni che il tuo browser web vede quando visita quell'URL. In che modo questo ci aiuta? Bene, dai un'occhiata alle bandiere per il curl
comando . Se passiamo il parametro --head
, cURL restituirà solo le intestazioni della richiesta. Provalo con un URL. Otterrai un elenco di righe del modulo:
header-name: header-value
Si noti, ovviamente, che la prima riga non assomiglia affatto a questa. Ricordi il codice di stato di cui abbiamo parlato in precedenza? Lo noterai nella prima riga come numero di tre cifre. Ciò che dobbiamo fare ora è estrarlo dalla prima riga usando Perl - e possiamo farlo nel terminale usando il -e
flag di Perl che ci fa passare il codice Perl direttamente all'interprete Perl. Dovremo anche aggiungere un flag aggiuntivo a cURL ( --silent
) per evitare che visualizzi una barra di avanzamento e incasini il nostro script Perl.
Ecco cosa ci serve ... è piuttosto complicato a causa della necessità di sfuggire molto dalla shell:
perl -e "\ $ s = \` curl [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; print \ $ 1"
Ciò che sostanzialmente sta facendo è recuperare l'URL con cURL ed eseguirlo attraverso un'espressione regolare Perl che estrae il codice di stato e lo stampa.
Ora è sufficiente inserire l'URL del file che si sta verificando e confrontarlo con "404". Se ottieni '404', puoi presumere che il file non esista.
Naturalmente, questo potrebbe essere molto difficile da manipolare nel terminale, quindi puoi scrivere un piccolo script che rende non solo più facile da capire, ma anche più facile da eseguire:
#!/usr/bin/perl
# Get the URL
$url = $ARGV[0];
# Fetch the header
$header = `curl $url --head --silent`;
# Try to find the status code
$header =~ m/(\d{3})/;
# Return the result
exit(0) if $1 == 404;
exit(1);
Basta copiarlo e incollarlo in un file. Per questo esempio, chiamerò il file url_check
. Quindi rendere eseguibile il file con:
chmod 755 url_check
Quindi puoi controllare qualsiasi file con il seguente semplice comando:
./url_check [URL]
Il valore restituito sarà '0' se il server ha restituito un 404 e '1' altrimenti. È quindi possibile concatenare questo comando nella shell proprio come si farebbe con qualsiasi altro comando.
ping
non invia affatto richieste HTTP. Piuttosto,ping
utilizza un protocollo chiamato "ICMP" per determinare se un host è raggiungibile e per controllare la latenza.