Comment tester la connectivité d'un serveur avec curl sous Linux

LinuxBeginner
Pratiquer maintenant

Introduction

Dans l'administration système Linux, vérifier la connectivité d'un serveur est une compétence fondamentale. Ce tutoriel vous guide à travers le processus de test de la connectivité serveur à l'aide de l'outil cURL. cURL (Client URL) est un utilitaire en ligne de commande qui permet le transfert de données via divers protocoles réseau, ce qui en fait un outil essentiel pour le diagnostic réseau et le dépannage.

À la fin de ce tutoriel, vous comprendrez comment utiliser cURL pour vérifier la disponibilité d'un serveur, mesurer les temps de réponse, analyser les codes d'état HTTP et résoudre les problèmes de connexion. Ces compétences sont précieuses, que vous gériez des serveurs web, des API ou tout autre service réseau dans votre environnement Linux.

Comprendre les bases de cURL

cURL est un outil en ligne de commande puissant qui vous permet de transférer des données en utilisant divers protocoles, notamment HTTP, HTTPS, FTP, et bien d'autres. Avant de plonger dans les tests de connectivité, comprenons ce qu'est cURL et comment l'utiliser pour des opérations de base.

Installation de cURL

L'utilitaire cURL est préinstallé sur la plupart des distributions Linux, y compris votre environnement Ubuntu 22.04. Pour vérifier que cURL est installé, ouvrez votre terminal et exécutez :

curl --version

Vous devriez voir une sortie similaire à celle-ci :

curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13
Release-Date: 2022-01-05
Protocols: dict file ftp ftps gopher gophers http https imap imaps ldap ldaps mqtt pop3 pop3s rtmp rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS brotli GSS-API HSTS HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP UnixSockets zstd

Cela confirme que cURL est installé et affiche la version ainsi que les protocoles et fonctionnalités pris en charge.

Syntaxe de base de cURL

La syntaxe de base pour utiliser cURL est :

curl [options] [URL]

Essayons une commande cURL simple pour récupérer le contenu d'un site web :

curl https://example.com

Cette commande envoie une requête GET à example.com et affiche la réponse HTML dans votre terminal. Vous devriez voir un code HTML similaire au suivant :

<!doctype html>
<html>
  <head>
    <title>Example Domain</title>
    <!-- More HTML content -->
  </head>
  <body>
    <div>
      <h1>Example Domain</h1>
      <p>This domain is for use in illustrative examples in documents...</p>
      <!-- More content -->
    </div>
  </body>
</html>

Enregistrer la sortie dans un fichier

Au lieu d'afficher la sortie dans le terminal, vous pouvez l'enregistrer dans un fichier en utilisant l'option -o ou --output :

curl -o example.html https://example.com

Cette commande enregistre la réponse de example.com dans un fichier nommé example.html. Pour vérifier que le fichier a été créé :

ls -l example.html

Vous devriez voir une sortie confirmant l'existence du fichier :

-rw-rw-r-- 1 labex labex 1256 Mar 28 12:34 example.html

Pour afficher le contenu du fichier :

cat example.html

Vous devriez voir le même contenu HTML que celui affiché précédemment dans le terminal.

Comprendre les méthodes HTTP avec cURL

cURL utilise la méthode HTTP GET par défaut, mais vous pouvez spécifier d'autres méthodes en utilisant l'option -X. Les méthodes HTTP courantes incluent :

  • GET : Récupérer des données depuis un serveur
  • POST : Soumettre des données à un serveur
  • PUT : Mettre à jour des données existantes sur un serveur
  • DELETE : Supprimer des données d'un serveur
  • HEAD : Similaire à GET, mais ne récupère que les en-têtes

Dans les étapes suivantes, nous explorerons comment utiliser ces différentes méthodes pour tester la connectivité et la fonctionnalité des serveurs.

Tester la connectivité de base d'un serveur

Maintenant que vous comprenez les bases de cURL, utilisons-le pour tester la connectivité d'un serveur. La capacité de vérifier si un serveur est actif et répond correctement est une compétence cruciale pour les administrateurs système et les développeurs.

Test de connexion simple

Le test de connectivité le plus basique consiste à envoyer une requête à un serveur et à voir s'il répond. Testons la connectivité aux serveurs de Google :

curl -I https://www.google.com

L'option -I (ou --head) indique à cURL d'envoyer une requête HEAD, qui ne récupère que les en-têtes sans le corps du contenu. C'est utile pour des vérifications de connectivité rapides. Vous devriez voir une sortie similaire à :

HTTP/2 200
content-type: text/html; charset=ISO-8859-1
date: Tue, 28 Mar 2023 12:34:56 GMT
server: gws
content-length: 219
x-xss-protection: 0
x-frame-options: SAMEORIGIN

Le code HTTP/2 200 indique une connexion réussie : le serveur est actif et répond.

Vérification des codes d'état HTTP

Les codes d'état HTTP sont des réponses standardisées que les serveurs envoient pour indiquer le résultat d'une requête client. Quelques codes d'état courants incluent :

  • 200 : OK - La requête a réussi
  • 301/302 : Redirection - La ressource a été déplacée
  • 404 : Non trouvé - La ressource n'existe pas
  • 500 : Erreur interne du serveur - Le serveur a rencontré une erreur

Testons une URL inexistante pour voir une réponse 404 :

curl -I https://www.google.com/nonexistent-page

La sortie devrait inclure un code d'état 404 :

HTTP/2 404
content-type: text/html; charset=UTF-8
date: Tue, 28 Mar 2023 12:35:01 GMT
server: gws
content-length: 1565
...

Mesurer le temps de réponse

Pour mesurer le temps nécessaire à un serveur pour répondre, utilisez l'option -w avec une chaîne de format :

curl -s -o /dev/null -w "Connect: %{time_connect}s\nTotal: %{time_total}s\n" https://www.google.com

Cette commande :

  • -s : Fonctionne en mode silencieux (pas de messages de progression ou d'erreur)
  • -o /dev/null : Redirige la sortie vers /dev/null (la supprime)
  • -w "..." : Affiche une sortie formatée avec des informations de temporisation

Vous devriez voir une sortie similaire à :

Connect: 0.052s
Total: 0.157s

Cela vous indique le temps nécessaire pour établir une connexion et le temps total pour que la requête se termine.

Tester la résolution de nom de domaine

Parfois, les problèmes de connectivité proviennent de problèmes DNS. Pour tester si un nom de domaine peut être résolu en une adresse IP :

curl -v https://www.example.com 2>&1 | grep "Trying"

Ceci utilise l'option -v (verbose) et filtre la ligne "Trying", qui montre l'adresse IP vers laquelle la connexion est établie. Vous devriez voir une sortie comme :

* Trying 93.184.216.34:443...

Cela confirme que le nom de domaine a été résolu avec succès en une adresse IP.

Créer un script de test de connexion simple

Créons un script shell simple pour tester la connectivité vers plusieurs sites. Ouvrez un éditeur de texte :

nano connection_test.sh

Ajoutez le contenu suivant au fichier :

#!/bin/bash

echo "Testing server connectivity..."

for site in google.com example.com github.com nonexistent-site.xyz; do
  echo -n "Testing $site: "

  ## Use curl with a 5-second timeout
  status_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 5 "https://$site" 2> /dev/null)

  if [ $? -eq 0 ] && [ "$status_code" -lt 400 ]; then
    echo "OK (Status: $status_code)"
  else
    echo "Failed (Status: $status_code)"
  fi
done

echo "Testing complete!"

Enregistrez le fichier en appuyant sur Ctrl+O, puis Entrée, et quittez avec Ctrl+X.

Rendez le script exécutable :

chmod +x connection_test.sh

Exécutez le script :

./connection_test.sh

Vous devriez voir une sortie indiquant l'état de connectivité de chaque site :

Testing server connectivity...
Testing google.com: OK (Status: 200)
Testing example.com: OK (Status: 200)
Testing github.com: OK (Status: 200)
Testing nonexistent-site.xyz: Failed (Status: 000)
Testing complete!

Ce script offre un moyen rapide de vérifier la connectivité vers plusieurs serveurs à la fois.

Tests de connectivité avancés avec cURL

Maintenant que vous comprenez les tests de connectivité de base, explorons des fonctionnalités plus avancées de cURL qui peuvent aider au dépannage et aux tests détaillés.

Utiliser le mode verbeux pour un débogage détaillé

Le mode verbeux (option -v) est inestimable pour dépanner les problèmes de connectivité car il montre l'intégralité du processus de requête et de réponse :

curl -v https://example.com

La sortie sera complète, montrant la résolution DNS, la poignée de main TLS, les en-têtes de requête, les en-têtes de réponse, et plus encore :

*   Trying 93.184.216.34:443...
* Connected to example.com (93.184.216.34) port 443 (#0)
* ALPN: offers h2
* ALPN: offers http/1.1
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN: server accepted h2
* Server certificate:
*  subject: C=US; ST=California; L=Los Angeles; O=Internet Corporation for Assigned Names and Numbers; CN=www.example.org
*  start date: Nov 24 00:00:00 2022 GMT
*  expire date: Nov 24 23:59:59 2023 GMT
*  subjectAltName: host "example.com" matched cert's "example.com"
*  issuer: C=US; O=DigiCert Inc; CN=DigiCert TLS RSA SHA256 2020 CA1
*  SSL certificate verify ok.
* using HTTP/2
* h2 [:method: GET]
* h2 [:path: /]
* h2 [:scheme: https]
* h2 [:authority: example.com]
* h2 [user-agent: curl/7.81.0]
* h2 [accept: */*]
* Using Stream ID: 1
> GET / HTTP/2
> Host: example.com
> user-agent: curl/7.81.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< age: 587269
< cache-control: max-age=604800
< content-type: text/html; charset=UTF-8
< date: Tue, 28 Mar 2023 12:40:01 GMT
< etag: "3147526947+ident"
< expires: Tue, 04 Apr 2023 12:40:01 GMT
< last-modified: Thu, 17 Oct 2019 07:18:26 GMT
< server: ECS (nyb/1D2B)
< vary: Accept-Encoding
< x-cache: HIT
< content-length: 1256
<
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
    <!-- More HTML content -->
</head>
<body>
    <div>
        <h1>Example Domain</h1>
        <p>This domain is for use in illustrative examples in documents...</p>
        <!-- More content -->
    </div>
</body>
</html>
* Connection #0 to host example.com left intact

Cette sortie détaillée vous aide à identifier exactement où une connexion pourrait échouer.

Tester différentes méthodes HTTP

Testons une requête POST vers un point de terminaison d'API de test :

curl -X POST -d "name=test&email=test@example.com" https://httpbin.org/post

Cette commande :

  • -X POST : Spécifie une requête POST
  • -d "name=test&email=test@example.com" : Envoie des données de formulaire dans la requête

Vous devriez recevoir une réponse JSON montrant vos données soumises :

{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "email": "test@example.com",
    "name": "test"
  },
  "headers": {
    "Accept": "*/*",
    "Content-Length": "32",
    "Content-Type": "application/x-www-form-urlencoded",
    "Host": "httpbin.org",
    "User-Agent": "curl/7.81.0",
    "X-Amzn-Trace-Id": "Root=1-642295b1-0d2340ef34f2e8ea6270241a"
  },
  "json": null,
  "origin": "198.51.100.42",
  "url": "https://httpbin.org/post"
}

Tester avec des en-têtes personnalisés

De nombreuses API nécessitent des en-têtes spécifiques pour l'authentification ou pour spécifier le type de contenu. Testons cela :

curl -H "User-Agent: MyCustomAgent" -H "Authorization: Bearer test-token" https://httpbin.org/headers

Cette commande :

  • -H "User-Agent: MyCustomAgent" : Définit un en-tête User-Agent personnalisé
  • -H "Authorization: Bearer test-token" : Définit un en-tête Authorization

La réponse affichera les en-têtes envoyés dans votre requête :

{
  "headers": {
    "Accept": "*/*",
    "Authorization": "Bearer test-token",
    "Host": "httpbin.org",
    "User-Agent": "MyCustomAgent",
    "X-Amzn-Trace-Id": "Root=1-642295c3-73cac0a73b34b1c93a8ce520"
  }
}

Tester les temps de réponse pour différents points de terminaison

Créons un script pour comparer les temps de réponse pour différents serveurs :

nano response_time.sh

Ajoutez le contenu suivant :

#!/bin/bash

echo "Testing response times..."

for site in google.com bing.com baidu.com duckduckgo.com yahoo.com; do
  echo -n "$site: "
  curl -s -o /dev/null -w "%{time_total}s" "https://$site"
  echo ""
done

echo "Testing complete!"

Enregistrez le fichier et rendez-le exécutable :

chmod +x response_time.sh

Exécutez le script :

./response_time.sh

La sortie affichera le temps de réponse pour chaque site :

Testing response times...
google.com: 0.187s
bing.com: 0.232s
baidu.com: 0.412s
duckduckgo.com: 0.298s
yahoo.com: 0.342s
Testing complete!

Ceci est utile pour comparer les performances de différents serveurs ou surveiller les performances d'un serveur au fil du temps.

Tester la connectivité TCP vers des ports spécifiques

Parfois, vous devez tester si un port spécifique est ouvert sur un serveur. cURL peut également être utilisé pour cela :

curl -v telnet://example.com:80

Si le port est ouvert, vous verrez un message de connexion réussie :

* Trying 93.184.216.34:80...
* Connected to example.com (93.184.216.34) port 80 (#0)

Appuyez sur Ctrl+C pour terminer la connexion.

De même, vous pouvez tester des connexions sécurisées :

curl -v https://example.com:443

La sortie verbeuse indiquera si la connexion a réussi ou s'il y a eu des problèmes.

Créer un outil de surveillance serveur complet

Maintenant que vous avez appris diverses techniques cURL pour les tests de connectivité, construisons un outil de surveillance serveur plus complet qui combine ces techniques.

Script de surveillance serveur complet

Créez un nouveau fichier de script :

nano server_monitor.sh

Ajoutez le contenu suivant :

#!/bin/bash

## Server Monitoring Script
## This script checks the availability and performance of specified servers

## Define colors for output
GREEN='\033[0;32m'
RED='\033[0;31m'
YELLOW='\033[0;33m'
NC='\033[0m' ## No Color

## Function to check server status
check_server() {
  local url=$1
  local timeout=5

  echo -e "\n${YELLOW}Testing $url:${NC}"

  ## Test connection and get status code
  status_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout $timeout "$url" 2> /dev/null)

  if [ "$status_code" -eq 200 ]; then
    echo -e "${GREEN}✓ Status: $status_code (OK)${NC}"
  elif [ "$status_code" -ge 100 ] && [ "$status_code" -lt 400 ]; then
    echo -e "${GREEN}✓ Status: $status_code (Success/Redirect)${NC}"
  elif [ "$status_code" -ge 400 ] && [ "$status_code" -lt 500 ]; then
    echo -e "${RED}✗ Status: $status_code (Client Error)${NC}"
  elif [ "$status_code" -ge 500 ]; then
    echo -e "${RED}✗ Status: $status_code (Server Error)${NC}"
  else
    echo -e "${RED}✗ Status: Connection failed${NC}"
  fi

  ## Measure response time if connection successful
  if [ "$status_code" -gt 0 ]; then
    response_time=$(curl -s -o /dev/null -w "%{time_total}" --connect-timeout $timeout "$url" 2> /dev/null)
    echo -e "• Response time: ${response_time}s"

    ## Get server headers
    echo "• Server headers:"
    curl -s -I --connect-timeout $timeout "$url" | grep -E 'Server:|Content-Type:|Date:' | sed 's/^/  /'
  fi
}

## Main function
main() {
  echo -e "${YELLOW}===== Server Connectivity Monitor =====${NC}"
  echo "Started at: $(date)"

  ## List of servers to monitor
  servers=(
    "https://www.google.com"
    "https://www.github.com"
    "https://www.example.com"
    "https://httpbin.org/status/404" ## This will return a 404 status
    "https://httpbin.org/status/500" ## This will return a 500 status
  )

  ## Check each server
  for server in "${servers[@]}"; do
    check_server "$server"
  done

  echo -e "\n${YELLOW}===== Monitoring Complete =====${NC}"
  echo "Finished at: $(date)"
}

## Run the main function
main

Enregistrez le fichier et rendez-le exécutable :

chmod +x server_monitor.sh

Exécutez le script :

./server_monitor.sh

La sortie fournira un aperçu complet de l'état de chaque serveur :

===== Server Connectivity Monitor =====
Started at: Tue Mar 28 13:15:01 UTC 2023

Testing https://www.google.com:
✓ Status: 200 (OK)
• Response time: 0.186s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:02 GMT
  Content-Type: text/html; charset=ISO-8859-1
  Server: gws

Testing https://www.github.com:
✓ Status: 200 (OK)
• Response time: 0.247s
• Server headers:
  Server: GitHub.com
  Date: Tue, 28 Mar 2023 13:15:02 GMT
  Content-Type: text/html; charset=utf-8

Testing https://www.example.com:
✓ Status: 200 (OK)
• Response time: 0.132s
• Server headers:
  Content-Type: text/html; charset=UTF-8
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Server: ECS (nyb/1D2B)

Testing https://httpbin.org/status/404:
✗ Status: 404 (Client Error)
• Response time: 0.189s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Content-Type: text/html; charset=utf-8
  Server: gunicorn/19.9.0

Testing https://httpbin.org/status/500:
✗ Status: 500 (Server Error)
• Response time: 0.192s
• Server headers:
  Date: Tue, 28 Mar 2023 13:15:03 GMT
  Content-Type: text/html; charset=utf-8
  Server: gunicorn/19.9.0

===== Monitoring Complete =====
Finished at: Tue Mar 28 13:15:04 UTC 2023

Planifier des vérifications de connectivité régulières

Pour surveiller les serveurs régulièrement, vous pouvez configurer une tâche cron. Dans un environnement de production réel, vous pourriez ajouter ce script à crontab pour qu'il s'exécute à intervalles réguliers. À des fins de démonstration, créons un script wrapper simple qui exécute la surveillance chaque minute pendant une durée spécifiée :

nano scheduled_monitor.sh

Ajoutez le contenu suivant :

#!/bin/bash

## Scheduled monitoring script
## This script runs the server_monitor.sh at regular intervals

## Check if duration parameter is provided
if [ $## -ne 1 ]; then
  echo "Usage: $0 <duration_in_minutes>"
  exit 1
fi

duration=$1
interval=60 ## seconds
iterations=$((duration * 60 / interval))

echo "Starting scheduled monitoring for $duration minutes..."
echo "Press Ctrl+C to stop monitoring"

for ((i = 1; i <= iterations; i++)); do
  echo -e "\n===== Run $i of $iterations ====="
  ./server_monitor.sh

  ## Don't sleep after the last iteration
  if [ $i -lt $iterations ]; then
    echo "Next check in $interval seconds..."
    sleep $interval
  fi
done

echo "Scheduled monitoring completed."

Enregistrez le fichier et rendez-le exécutable :

chmod +x scheduled_monitor.sh

Exécutez le script pendant 2 minutes (vous pouvez augmenter ou diminuer selon vos besoins) :

./scheduled_monitor.sh 2

Cela exécutera le script de surveillance serveur chaque minute pendant 2 minutes :

Starting scheduled monitoring for 2 minutes...
Press Ctrl+C to stop monitoring

===== Run 1 of 2 =====
===== Server Connectivity Monitor =====
...
(monitoring output)
...
Next check in 60 seconds...
(waits for 60 seconds)

===== Run 2 of 2 =====
===== Server Connectivity Monitor =====
...
(monitoring output)
...
Scheduled monitoring completed.

Dans un environnement de production, vous configureriez généralement une tâche cron, mais ce script offre un moyen simple d'effectuer une surveillance planifiée pendant cet exercice de laboratoire.

Résumé

Dans ce laboratoire, vous avez exploré comment utiliser cURL pour tester la connectivité serveur dans un environnement Linux. En commençant par les bases, vous avez appris à envoyer des requêtes HTTP simples et à enregistrer les réponses dans des fichiers. Vous avez ensuite progressé vers des opérations plus complexes, notamment la vérification des codes d'état HTTP, la mesure des temps de réponse et l'utilisation du mode verbeux pour un débogage détaillé.

Vous avez créé plusieurs scripts pratiques qui démontrent la puissance de cURL pour la surveillance serveur et les tests de connectivité :

  1. Un script de test de connexion de base qui vérifie la connectivité vers plusieurs serveurs
  2. Un script de comparaison des temps de réponse pour mesurer et comparer les performances des serveurs
  3. Un outil de surveillance serveur complet qui fournit des informations détaillées sur l'état du serveur, les temps de réponse et les informations d'en-tête
  4. Un script de surveillance planifiée qui automatise les vérifications de connectivité régulières

Ces outils et techniques sont inestimables pour les administrateurs système, les développeurs et toute personne travaillant avec des systèmes en réseau. En maîtrisant cURL, vous disposez désormais d'un outil puissant dans votre arsenal pour diagnostiquer et résoudre les problèmes de connectivité dans votre environnement Linux.

Alors que vous continuez à travailler avec des systèmes Linux, rappelez-vous que cURL n'est pas seulement utile pour tester la connectivité, mais aussi pour interagir avec des API, télécharger des fichiers et automatiser diverses tâches liées au réseau. Les compétences que vous avez acquises dans ce laboratoire serviront de base pour des opérations réseau et un dépannage plus avancés à l'avenir.