Évitez les erreurs de connexion dans les scripts Bash en vérifiant les URL : voici comment procéder
Sommaire
Points clés à retenir
- Évitez de supposer que les URL sont valides. Vérifiez leur statut avant utilisation.
- La commande wget peut tester la validité d'une URL et vous donner un aperçu des échecs.
- La commande cURL peut récupérer le code de réponse HTTP du serveur Web, pour un contrôle plus précis.
Lorsque vous codez, les hypothèses sont l'ennemi de la robustesse. Vérifiez les adresses Web avant de les utiliser pour vérifier qu'elles sont correctement formées et en ligne. Ces techniques vérifient les URL et gèrent efficacement les conditions d'erreur.
Ne vous contentez pas d'espérer, vérifiez
L’utilisation d’une adresse Web ou d’un localisateur de ressources uniformes (URL) dans un script implique un acte de foi. Il existe toutes sortes de raisons pour lesquelles l’utilisation de l’URL peut échouer.
L'URL peut contenir des fautes de frappe, surtout si l'URL est transmise en tant que paramètre au script.
L'URL est peut-être obsolète. La ressource en ligne vers laquelle elle pointe peut être temporairement hors ligne ou avoir été supprimée définitivement.
Vérifier si l'URL existe et répond correctement avant d'essayer de l'utiliser est une bonne pratique de travail. Voici quelques méthodes que vous pouvez utiliser pour vérifier que vous pouvez utiliser une URL en toute sécurité et gérer correctement les conditions d'erreur.
Les outils dont nous avons besoin sont wget et cURL.
Utiliser wget pour vérifier une URL
La commande wget est utilisée pour télécharger des fichiers, mais nous pouvons supprimer l'action de téléchargement en utilisant son option –spider. Lorsque nous faisons cela, wget nous donne des informations utiles indiquant si l'URL est accessible et répond.
Nous essaierons de voir si google.com est opérationnel et actif, puis nous essaierons une URL fictive de geegle.com. Nous vérifierons les codes de retour dans chaque cas.
wget --spider https:
echo $?
wget --spider https:
echo $?
Comme nous pouvons le constater, wget nous fait savoir que Google est bel et bien vivant, alors que Geegle (sans surprise) ne l'est pas. Notez également que le code de sortie en cas de succès est zéro et en cas d'échec, il est quatre.
Zéro signifie succès, tout le reste signifie qu’il y a une sorte de problème. Nous pouvons utiliser ces valeurs dans notre script pour contrôler le flux d'exécution.
Vous ne pouvez pas manquer de remarquer que wget envoie beaucoup de résultats à l'écran. Nous pouvons supprimer la sortie avec l'option -q (quiet).
wget --spider -q https:
echo $?
wget --spider -q https:
echo $?
Ouvrez votre éditeur préféré, copiez-y ces lignes et enregistrez-le sous url-1.sh.
#!/bin/bashif wget --spider -q https:
echo "The URL exists and is accessible."
else
echo "Can't access that URL."
fi
Vous devrez rendre le script exécutable.
chmod +x url-1.sh
Vous devrez le faire avec tous les scripts discutés ici. Utilisez le nom de script approprié dans chaque cas. Exécutons notre script.
./url-1.sh
Le test de comparaison if détecte la réponse nulle de la commande wget et exécute la première clause de l'instruction if. Si vous modifiez le script et changez l'URL en quelque chose comme https://www.geegle.com, il signalera un échec.
./url-1.sh
Il existe huit réponses différentes que wget peut générer, dont sept sont des conditions d'erreur.
- 0: Aucun problème n'est survenu.
- 1: Code d'erreur générique.
- 2: Erreur lors de l'analyse des options de ligne de commande.
- 3: Erreur d'E/S de fichier.
- 4: Panne de réseau.
- 5: Échec de la vérification SSL.
- 6: Échec de l'authentification du nom d'utilisateur/mot de passe.
- 7: Erreurs de protocole.
- 8: Le serveur a émis une réponse d'erreur.
La commande cURL développe cela. Il peut afficher le code de réponse HTTP de l'URL (ou, plus exactement, du serveur Web hébergeant l'URL).
Isoler le code de réponse HTTP
Vous devrez peut-être installer la commande cURL. Vous le trouverez dans les référentiels de votre distribution.
Sur Ubuntu, utilisez :
sudo apt install curl
Sur Fedora, tapez :
sudo dnf install curl
Sur Manjaro et Arch, la commande est :
sudo pacman -S curl
Pointons cURL vers Google et voyons ce que nous obtenons. L'option –head indique à curl de récupérer uniquement les informations d'en-tête du site Web, plutôt que de télécharger la page Web entière. L'option –silent ne supprime pas la sortie de cURL, elle empêche cURL de rendre compte de sa progression.
curl --head --silent https:
echo $?
Le code de sortie zéro est cURL nous indiquant que tout allait bien, mais la réponse que nous recherchons est le code HTTP réel du serveur. Ce sont les 200 de la première ligne de sortie. Dans le langage HTTP, 200 signifie succès.
Nous pouvons affiner le comportement de cURL en dirigeant sa sortie vers /dev/null afin qu'il s'exécute silencieusement, puis annuler partiellement cela en utilisant l'option –write-out pour envoyer le code de réponse HTTP à la fenêtre du terminal.
curl --head --silent --output /dev/null --write-out '%{http_code}' https:
Maintenant que nous avons le code de réponse HTTP, nous pouvons l'utiliser dans un script.
Utiliser cURL pour vérifier une URL
Ce script attribue le code de réponse HTTP à une variable appelée résultat. Copiez-le dans votre éditeur, enregistrez-le sous url-2.sh, puis utilisez chmod pour le rendre exécutable.
#!/bin/bashresult=$(curl --head --silent --write-out "%{http_code}" --output /dev/null https:
if (( $result -eq 200 )); then
echo "The URL exists and is accessible."
else
echo "Can't access that URL."
fi
Le test de comparaison if vérifie la variable par rapport à la valeur 200. Si elle correspond, le script exécute la première clause de l'instruction if. Toute autre valeur est traitée comme une condition d'erreur et la deuxième clause est exécutée.
./url-2.sh
Gestion de différentes conditions d'erreur
Maintenant que nous disposons d'un moyen de récupérer le code HTTP, nous pouvons développer la capacité de notre script à gérer différentes conditions d'erreur.
#!/bin/bashtarget="https://www.google.com"
result=$(curl --head --silent --output /dev/null --write-out '%{http_code}' "$target")
case $result in
200)
echo "The URL exists and is accessible."
;;
301)
echo "HTTP error 301. The resource has been permanently relocated."
;;
403)
echo "HTTP error 403. The server heard you, but won't comply."
;;
404)
echo "HTTP error 404. The classic Page Not Found."
;;
000)
echo "No response from server."
;;
*)
echo "HTTP error $result."
;;
esac
L'URL est affectée à une variable appelée cible. Cette variable est utilisée dans la commande cURL. Si vous avez une URL très longue, cela rend le script plus facile à lire.
Le code HTTP est capturé dans une variable appelée result. Ceci est utilisé dans une instruction case. Cette structure vous permet d'avoir des sections dédiées gérant des types d'erreurs spécifiques. Le dernier cas '*)' capture toutes les conditions d'erreur qui ne sont pas gérées par un cas dédié.
Copiez-le dans votre éditeur, enregistrez-le sous url-3.sh et utilisez chmod pour le rendre exécutable.
./url-3.sh
./url-3.sh
./url-3.sh
Notre script répond désormais à une gamme de codes de réponse HTTP.
Gestion des délais d'attente
Un autre scénario auquel notre script devrait faire face consiste à éviter les longues pauses dans l'attente d'une réponse d'un serveur Web lent.
Nous pouvons ajouter deux options supplémentaires à la ligne de commande cURL. L'option –connect-timeout définit une limite pendant laquelle cURL attendra qu'une connexion soit établie.
Le délai d'attente –max-time spécifie le temps total que cURL passera à exécuter la commande. Notez que le délai d'attente –max-time se déclenchera même si la commande fonctionne et est toujours en cours. Si vous l'utilisez, expérimentez sur la ligne de commande pour établir une valeur de temps sûre à utiliser.
Nous pouvons ajouter ces options à la commande cURL comme ceci :
curl --head --connect-timeout 8 --max-time 14 --silent --output /dev/null --write-out '%{http_code}' https:
Autres possibilités
La section du script contenant la commande cURL et les vérifications du code de réponse HTTP pourrait être une fonction à part entière. Toute URL utilisée par votre script peut lui être transmise pour vérification.
Vous pourriez avoir un fichier contenant une liste d’URL. Votre script pourrait ouvrir le fichier, le lire ligne par ligne et vérifier chaque URL. Ce serait un moyen simple de surveiller la santé d'un ensemble de serveurs Web.