Files
scripts-bash/local/bin/sshconnect.sh
T
cedricAbonnel 2b8690c34b feat: sshconnect — refactoring UX et robustesse
- Serveurs ON affichés en premier (tri ON>OFF puis alphabétique)
- Affichage user@hostname dans la liste
- Panneau preview fzf : hostname/user/port/identityfile par host
- --ansi pour les couleurs ON (vert) / OFF (rouge)
- Champ status caché (|ON|OFF|) pour logique propre sans regex sur ANSI
- exec ssh remplace le process shell (pas de fork inutile)
- Passage à -P 20 pour les parcs avec beaucoup de serveurs
- read -r et printf à la place de echo -e
2026-04-30 08:39:59 +02:00

61 lines
1.9 KiB
Bash
Executable File

#!/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