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.zip
existe ou non? J'ai essayé d'utiliser la ping
commande, 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?
command-line
scripts
ping
Egy Mohammad Erdin
la source
la source
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.Réponses:
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:
Une fois que vous l'avez installé, vous pouvez l'invoquer comme ceci:
... 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: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:
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:
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:Ensuite, vous pouvez vérifier n'importe quel fichier avec la commande simple suivante:
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.
la source
cut
commandes ... mais ne fonctionne toujours pas, .. pour l'instant, je le fais juste comme ce que vous avez fait ..curl $url --head --silent | head -n 1 | cut -d ' ' -f 2
?'
) au lieu de guillemets doubles ("
) autour de votre expression perl.Vous pouvez utiliser l'
--spider
option 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 OK
si le fichier est là, soit une erreur, par exemple404 Not Found
s'il n'est pas là, ou403 Forbidden
si vous n'avez pas la permission de l'obtenir.la source
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.la source