Skip to content

check-connectivity.sh

Niveau : Dรฉbutant

Test de connectivitรฉ rรฉseau avec diagnostic complet.


Description

Ce script vรฉrifie la connectivitรฉ rรฉseau : - Test de la passerelle locale - Test DNS - Test de connexion Internet - Latence et perte de paquets - Rapport dรฉtaillรฉ


Prรฉrequis

  • Systรจme : Linux (RHEL/Debian)
  • Permissions : Utilisateur standard (pas de sudo requis)
  • Dรฉpendances : ping, ip, nslookup, curl (optionnel)

Cas d'Usage

  • Diagnostic de connexion : Test rapide de la connectivitรฉ lors de problรจmes rรฉseau
  • Validation post-installation : Vรฉrification que la configuration rรฉseau fonctionne correctement
  • Monitoring automatisรฉ : Intรฉgration dans des systรจmes de surveillance pour alertes rรฉseau
  • Troubleshooting utilisateur : Script simple pour support technique de premier niveau

Script

#!/bin/bash
#===============================================================================
# Script Name: check-connectivity.sh
# Description: Network connectivity test
# Author: ShellBook
# Version: 1.0
#===============================================================================

set -euo pipefail

# Colors
readonly RED='\033[0;31m'
readonly GREEN='\033[0;32m'
readonly YELLOW='\033[1;33m'
readonly CYAN='\033[0;36m'
readonly NC='\033[0m'

# Default configuration
PING_COUNT=4
TIMEOUT=5
DNS_SERVERS=("8.8.8.8" "1.1.1.1")
TEST_HOSTS=("google.com" "cloudflare.com" "github.com")

usage() {
    cat << EOF
Usage: $(basename "$0") [OPTIONS]

Test de connectivitรฉ rรฉseau avec diagnostic.

Options:
    -c, --count NUM      Nombre de pings (default: 4)
    -t, --timeout SEC    Timeout en seconds (default: 5)
    -h, --help           Show this help

Examples:
    $(basename "$0")              # Test standard
    $(basename "$0") -c 10        # 10 pings par test
EOF
}

log_ok() {
    echo -e "${GREEN}[โœ“]${NC} $1"
}

log_fail() {
    echo -e "${RED}[โœ—]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[!]${NC} $1"
}

log_info() {
    echo -e "${CYAN}[i]${NC} $1"
}

print_header() {
    echo -e "\n${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
    echo -e "${GREEN}  $1${NC}"
    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
}

get_default_gateway() {
    ip route | grep default | awk '{print $3}' | head -1
}

get_dns_servers() {
    grep "nameserver" /etc/resolv.conf 2>/dev/null | awk '{print $2}' | head -2
}

test_ping() {
    local host=$1
    local name=$2

    local result
    if result=$(ping -c "$PING_COUNT" -W "$TIMEOUT" "$host" 2>&1); then
        local latency=$(echo "$result" | grep "avg" | awk -F'/' '{print $5}')
        local loss=$(echo "$result" | grep "packet loss" | awk '{print $6}')

        if [[ "$loss" == "0%" ]]; then
            log_ok "$name ($host): ${latency}ms avg, $loss loss"
            return 0
        else
            log_warn "$name ($host): ${latency}ms avg, $loss loss"
            return 1
        fi
    else
        log_fail "$name ($host): Non joignable"
        return 2
    fi
}

test_dns_resolution() {
    local domain=$1
    local dns_server=$2

    if nslookup "$domain" "$dns_server" &>/dev/null; then
        local ip=$(nslookup "$domain" "$dns_server" 2>/dev/null | grep -A1 "Name:" | grep "Address" | awk '{print $2}' | head -1)
        log_ok "Rรฉsolution DNS ($dns_server): $domain -> $ip"
        return 0
    else
        log_fail "Rรฉsolution DNS ($dns_server): ร‰chec pour $domain"
        return 1
    fi
}

test_http() {
    local url=$1

    if command -v curl &>/dev/null; then
        local http_code
        http_code=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout "$TIMEOUT" "https://$url" 2>/dev/null || echo "000")

        if [[ "$http_code" == "200" ]] || [[ "$http_code" == "301" ]] || [[ "$http_code" == "302" ]]; then
            log_ok "HTTP $url: Code $http_code"
            return 0
        else
            log_fail "HTTP $url: Code $http_code"
            return 1
        fi
    else
        log_warn "curl non disponible, test HTTP ignorรฉ"
        return 0
    fi
}

check_local_network() {
    print_header "Rร‰SEAU LOCAL"

    local status=0

    # Interface active
    local interface=$(ip route | grep default | awk '{print $5}' | head -1)
    if [[ -n "$interface" ]]; then
        local ip_addr=$(ip addr show "$interface" | grep "inet " | awk '{print $2}')
        log_info "Interface active: $interface ($ip_addr)"
    else
        log_fail "Aucune interface rรฉseau active"
        status=1
    fi

    # Passerelle
    local gateway=$(get_default_gateway)
    if [[ -n "$gateway" ]]; then
        test_ping "$gateway" "Passerelle" || status=1
    else
        log_fail "Aucune passerelle par dรฉfaut"
        status=1
    fi

    return $status
}

check_dns() {
    print_header "Rร‰SOLUTION DNS"

    local status=0
    local system_dns

    # DNS systรจme
    system_dns=$(get_dns_servers)
    if [[ -n "$system_dns" ]]; then
        log_info "DNS configurรฉs: $system_dns"

        for dns in $system_dns; do
            test_ping "$dns" "DNS $dns" || true
        done
    fi

    # Test de rรฉsolution
    for dns in "${DNS_SERVERS[@]}"; do
        test_dns_resolution "google.com" "$dns" || status=1
    done

    return $status
}

check_internet() {
    print_header "CONNECTIVITร‰ INTERNET"

    local status=0

    # Ping hosts externes
    for host in "${TEST_HOSTS[@]}"; do
        test_ping "$host" "$host" || status=1
    done

    # Test HTTP
    echo ""
    log_info "Test HTTP/HTTPS:"
    for host in "${TEST_HOSTS[@]}"; do
        test_http "$host" || status=1
    done

    return $status
}

check_ports() {
    print_header "PORTS COURANTS"

    local test_host="google.com"
    local ports=("80:HTTP" "443:HTTPS" "53:DNS")

    for port_info in "${ports[@]}"; do
        local port=${port_info%%:*}
        local name=${port_info##*:}

        if timeout "$TIMEOUT" bash -c "echo >/dev/tcp/$test_host/$port" 2>/dev/null; then
            log_ok "Port $port ($name): Ouvert"
        else
            log_warn "Port $port ($name): Filtrรฉ ou fermรฉ"
        fi
    done
}

show_network_info() {
    print_header "INFORMATIONS Rร‰SEAU"

    # IP publique
    if command -v curl &>/dev/null; then
        local public_ip
        public_ip=$(curl -s --connect-timeout 5 ifconfig.me 2>/dev/null || echo "Non disponible")
        log_info "IP Publique: $public_ip"
    fi

    # Interfaces
    echo ""
    log_info "Interfaces rรฉseau:"
    ip -4 addr show | grep -E "inet " | while read -r line; do
        local ip=$(echo "$line" | awk '{print $2}')
        local iface=$(echo "$line" | awk '{print $NF}')
        echo "    $iface: $ip"
    done
}

main() {
    # Parse arguments
    while [[ $# -gt 0 ]]; do
        case $1 in
            -c|--count)
                PING_COUNT="$2"
                shift 2
                ;;
            -t|--timeout)
                TIMEOUT="$2"
                shift 2
                ;;
            -h|--help)
                usage
                exit 0
                ;;
            *)
                echo "Unknown option: $1"
                usage
                exit 1
                ;;
        esac
    done

    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
    echo -e "${GREEN}          DIAGNOSTIC DE CONNECTIVITร‰ Rร‰SEAU               ${NC}"
    echo -e "${CYAN}โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•${NC}"
    echo -e "  Date: $(date '+%Y-%m-%d %H:%M:%S')"
    echo -e "  Host: $(hostname)"

    local global_status=0

    check_local_network || global_status=1
    check_dns || global_status=1
    check_internet || global_status=1
    check_ports || true
    show_network_info

    # Rรฉsumรฉ
    print_header "Rร‰SUMร‰"
    if [[ $global_status -eq 0 ]]; then
        log_ok "Connectivitรฉ rรฉseau: OK"
    else
        log_fail "Connectivitรฉ rรฉseau: Problรจmes dรฉtectรฉs"
    fi

    exit $global_status
}

main "$@"

Usage

# Rendre exรฉcutable
chmod +x check-connectivity.sh

# Test standard
./check-connectivity.sh

# Plus de pings
./check-connectivity.sh -c 10

# Timeout plus long
./check-connectivity.sh -t 10

Sortie Exemple

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
          DIAGNOSTIC DE CONNECTIVITร‰ Rร‰SEAU
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  Date: 2024-01-15 14:30:22
  Host: workstation01

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  Rร‰SEAU LOCAL
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[i] Interface active: eth0 (192.168.1.100/24)
[โœ“] Passerelle (192.168.1.1): 0.845ms avg, 0% loss

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  Rร‰SOLUTION DNS
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[i] DNS configurรฉs: 192.168.1.1
[โœ“] DNS 192.168.1.1 (192.168.1.1): 1.234ms avg, 0% loss
[โœ“] Rรฉsolution DNS (8.8.8.8): google.com -> 142.250.185.78
[โœ“] Rรฉsolution DNS (1.1.1.1): google.com -> 142.250.185.78

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  CONNECTIVITร‰ INTERNET
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[โœ“] google.com (google.com): 12.345ms avg, 0% loss
[โœ“] cloudflare.com (cloudflare.com): 8.234ms avg, 0% loss
[โœ“] github.com (github.com): 45.678ms avg, 0% loss

[i] Test HTTP/HTTPS:
[โœ“] HTTP google.com: Code 200
[โœ“] HTTP cloudflare.com: Code 200
[โœ“] HTTP github.com: Code 200

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  PORTS COURANTS
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[โœ“] Port 80 (HTTP): Ouvert
[โœ“] Port 443 (HTTPS): Ouvert
[โœ“] Port 53 (DNS): Ouvert

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  INFORMATIONS Rร‰SEAU
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[i] IP Publique: 203.0.113.45

[i] Interfaces rรฉseau:
    lo: 127.0.0.1/8
    eth0: 192.168.1.100/24

โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
  Rร‰SUMร‰
โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•โ•
[โœ“] Connectivitรฉ rรฉseau: OK

Voir Aussi