#!/bin/bash mapfile -t ALL_HOSTS < <( grep -hriI "^Host " ~/.ssh/config ~/.ssh/config.d/ ~/.ssh/include/ 2>/dev/null \ | awk '{print $2}' \ | grep -v '\*' \ | sort -u ) TOTAL=${#ALL_HOSTS[@]} check_host() { local host=$1 local info addr port user info=$(ssh -G "$host" 2>/dev/null) addr=$(awk '/^hostname / {print $2}' <<< "$info") port=$(awk '/^port / {print $2}' <<< "$info") user=$(awk '/^user / {print $2}' <<< "$info") if (timeout 0.7s bash -c "cat < /dev/null > /dev/tcp/$addr/$port") 2>/dev/null; then printf "\033[32m[ ON ]\033[0m|ON|%-22s|%s@%s\n" "$host" "$user" "$addr" else printf "\033[31m[ OFF ]\033[0m|OFF|%-22s|%s@%s\n" "$host" "$user" "$addr" fi } export -f check_host printf "Vérification de %d serveurs...\n" "$TOTAL" # Scan parallèle — ON affiché en premier, puis tri alphabétique STATE_LIST=$( printf "%s\n" "${ALL_HOSTS[@]}" \ | xargs -I {} -P 20 bash -c 'check_host "{}"' \ | sort -t'|' -k2,2r -k3,3 ) choice=$(echo "$STATE_LIST" | fzf \ --ansi \ --height 70% \ --reverse \ --delimiter="|" \ --with-nth=1,3,4 \ --header "Entrée: connexion | ESC: annuler | Filtre: ON / OFF / nom" \ --preview 'host=$(echo {} | cut -d"|" -f3 | tr -d " "); ssh -G "$host" 2>/dev/null | grep -E "^(hostname|user|port|identityfile|compression) " | column -t' \ --preview-window=right:45%:wrap) if [ -n "$choice" ]; then status=$(echo "$choice" | cut -d'|' -f2) host_to_connect=$(echo "$choice" | cut -d'|' -f3 | tr -d '[:space:]') if [[ "$status" == "ON" ]]; then clear exec ssh "$host_to_connect" else printf "\033[0;31m⚠ Le serveur '%s' semble OFFLINE.\033[0m\n" "$host_to_connect" read -rp "Tenter quand même la connexion ? (y/n) : " confirm [[ $confirm == [yY] ]] && exec ssh "$host_to_connect" fi fi