comment détecter un fichier sur Internet en utilisant ping ou une commande similaire?


10

J'ai un script shell pour télécharger certains de mes trucs sur Internet. Comment savoir si un fichier existe sur Internet? Disons que je veux savoir s'il http://192.168.1.1/backup/01012011.zipexiste ou non? J'ai essayé d'utiliser la pingcommande, mais cela montre une erreur, je suppose que c'est parce que le /caractère.

Quelqu'un peut-il m'aider? ou existe-t-il un autre moyen?


Il convient de noter qu'il pingn'envoie pas du tout de requêtes HTTP. Il pingutilise plutôt un protocole appelé «ICMP» pour déterminer si un hôte est accessible et pour vérifier la latence.
Nathan Osman

Réponses:


8

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 curlcommande . 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 -edrapeau 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.


merci beaucoup pour la théorie et la solution, ... mais la partie perl, .. je me demande de le faire juste avec un simple script shell, .. sur le travail, ....
Egy Mohammad Erdin

@Warung: Eh bien ... un script shell devra appeler une commande externe non seulement pour interroger une URL distante, mais aussi pour analyser la réponse.
Nathan Osman

yups ... et mybe je peux essayer d'analyser la réponse avec des cutcommandes ... mais ne fonctionne toujours pas, .. pour l'instant, je le fais juste comme ce que vous avez fait ..
Egy Mohammad Erdin

@ WarungNasi49: quelque chose comme curl $url --head --silent | head -n 1 | cut -d ' ' -f 2?
zpea

@GeorgeEdison: Belle réponse! Comme vous l'avez mentionné en citant le code perl de bash: vous pouvez vous débarrasser de nombreuses barres obliques inverses si vous placez des guillemets ( ') au lieu de guillemets doubles ( ") autour de votre expression perl.
zpea

13

Vous pouvez utiliser l' --spideroption de wget, qui ne télécharge pas réellement le fichier, mais vérifie simplement s'il est là. Dans votre exemple:

wget --spider http://192.168.1.1/backup/01012011.zip

Cela retournera soit un message contenant 200 OKsi le fichier est là, soit une erreur, par exemple 404 Not Founds'il n'est pas là, ou 403 Forbiddensi vous n'avez pas la permission de l'obtenir.


1
wget http://192.168.1.1/backup/01012011.zip

Le code de résultat 0 signifie oui, autre chose - non.

Vous pouvez vérifier le code de résultat à l'intérieur du script avec une $?variable.


1
Hé Mikail! L'interprétation des valeurs de retour est une bonne idée. Cependant, cette commande téléchargerait l'intégralité du fichier, pas seulement vérifier s'il est disponible.
zpea
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.