Il existe certainement un autre moyen - mais cela nécessite de comprendre ce qui se passe réellement lorsqu'une demande est faite sur Internet. Lorsque vous visitez une page de votre navigateur Web, les données sont transférées à l'aide d'un protocole appelé HTTP (oui, c'est pourquoi vous le verrez souvent http://
au début des URL).
HTTP est un protocole textuel. Des informations sont échangées entre le client et le serveur en envoyant des en-têtes suivis du corps de la demande. Les en-têtes contiennent de nombreuses informations d'état sur la demande et les informations en cours de transfert. L'en-tête qui vous intéressera pour vous aider avec votre problème n'est pas du tout un en-tête - c'est la toute première ligne transférée et contient un numéro appelé le code d'état. Ce numéro est composé de 3 chiffres et transmet des informations d'état. Si une demande a abouti, le résultat est généralement 200 (pas toujours - il y a des exceptions).
Une chose est sûre: si le fichier que vous avez demandé n'existe pas sur le serveur Web, le serveur doit répondre avec un code d'état de 404. Cela indique que la ressource est introuvable. (Pour les curieux, voici une liste des codes d'état HTTP et leur signification.)
Eh bien, assez de théorie. Voyons comment faire cela sur le terminal. Un cURL, qui est disponible dans les dépôts Ubuntu, est un excellent outil pour récupérer les demandes à l'aide de HTTP qui nous permet également d'examiner le code d'état. Vous pouvez l'installer avec:
sudo apt-get install curl
Une fois que vous l'avez installé, vous pouvez l'invoquer comme ceci:
curl [website]
... et le contenu de l'URL donnée sera imprimé sur le terminal. Il s'agit des informations que votre navigateur Web voit lorsqu'il visite cette URL. Comment cela nous aide-t-il? Eh bien, regardez attentivement les drapeaux de la curl
commande . Si nous transmettons le paramètre --head
, cURL renverra uniquement les en-têtes de la demande. Essayez-le avec une URL. Vous obtiendrez une liste de lignes du formulaire:
header-name: header-value
Notez bien sûr que la toute première ligne ne ressemble en rien à cela. Rappelez-vous le code d'état dont nous avons parlé plus tôt? Vous le remarquerez dans la première ligne sous la forme d'un nombre à trois chiffres. Ce que nous devons faire maintenant, c'est l'extraire de la première ligne en utilisant Perl - et nous pouvons le faire dans le terminal en utilisant le -e
drapeau de Perl qui nous permet de passer le code Perl directement à l'interpréteur Perl. Nous avons aussi besoin d'ajouter un drapeau supplémentaire à cURL ( --silent
) afin de l' empêcher d'afficher une barre de progression et de déconner notre script Perl.
Voici ce dont nous avons besoin ... c'est assez compliqué en raison de la nécessité d'en échapper beaucoup au shell:
perl -e "\ $ s = \` curl [URL] --head --silent \ `; \ $ s = ~ m / (\\ d {3}) /; print \ $ 1"
Cela consiste essentiellement à récupérer l'URL avec cURL et à l'exécuter via une expression régulière Perl qui extrait le code d'état et l'imprime.
Maintenant, tout ce dont vous avez besoin est de mettre l'URL du fichier que vous recherchez et de le comparer à '404'. Si vous obtenez '404', vous pouvez supposer que le fichier n'existe pas.
Bien sûr, cela pourrait être très difficile à manipuler dans le terminal, vous pouvez donc écrire un petit script qui rend cela non seulement plus facile à comprendre, mais aussi plus facile à exécuter:
#!/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);
Copiez et collez simplement cela dans un fichier. Pour cet exemple, je vais appeler le fichier url_check
. Rendez ensuite le fichier exécutable avec:
chmod 755 url_check
Ensuite, vous pouvez vérifier n'importe quel fichier avec la commande simple suivante:
./url_check [URL]
La valeur de retour sera «0» si le serveur a renvoyé un 404 et «1» sinon. Vous pouvez ensuite chaîner cette commande dans le shell comme vous le feriez pour n'importe quelle autre commande.
ping
n'envoie pas du tout de requêtes HTTP. Ilping
utilise plutôt un protocole appelé «ICMP» pour déterminer si un hôte est accessible et pour vérifier la latence.