#!/bin/bash # 1. Liste des hosts mapfile -t ALL_HOSTS < <(grep -riI "^Host " ~/.ssh/config ~/.ssh/config.d/ 2>/dev/null | awk '{print $2}' | grep -v '*' | sort -u) check_host() { local host=$1 local info=$(ssh -G "$host") local addr=$(echo "$info" | awk '/^hostname / {print $2}') local port=$(echo "$info" | awk '/^port / {print $2}') # Test de port TCP if (timeout 0.7s bash -c "cat < /dev/null > /dev/tcp/$addr/$port") 2>/dev/null; then # On utilise "|" comme délimiteur interne printf "[ ON ]|%s\n" "$host" else printf "[ OFF ]|%s\n" "$host" fi } export -f check_host echo "Vérification des serveurs..." # 2. Scan parallèle STATE_LIST=$(printf "%s\n" "${ALL_HOSTS[@]}" | xargs -I {} -P 10 bash -c 'check_host "{}"') # 3. Interface FZF # On demande à fzf d'afficher les colonnes proprement choice=$(echo "$STATE_LIST" | fzf --height 40% --reverse \ --delimiter="\|" \ --with-nth=1,2 \ --header "Tapez 'OFF' pour les serveurs HS | 'ON' pour les actifs") # 4. Connexion propre if [ -n "$choice" ]; then # On extrait le nom de l'hôte en utilisant le délimiteur "|" host_to_connect=$(echo "$choice" | cut -d'|' -f2) # Nettoyage radical des caractères invisibles ou espaces restants host_to_connect=$(echo "$host_to_connect" | tr -d '[:space:]') if [[ "$choice" == *"[ ON ]"* ]]; then clear ssh "$host_to_connect" else echo -e "\033[0;31m⚠️ Le serveur $host_to_connect semble OFFLINE.\033[0m" read -p "Tenter quand même la connexion ? (y/n) " confirm [[ $confirm == [yY] ]] && ssh "$host_to_connect" fi fi