#!/usr/bin/env bash # ZION TERMINAL - Menu de servidores SSH (com favoritos) # Cyberdeck criado por Pablo Murad em 2026 export LC_ALL=C . /opt/zion-terminal/bin/zion-lib.sh 2>/dev/null CFG="$HOME/.ssh/config" FAV="/opt/zion-terminal/config/ssh-favoritos.conf" [ "$1" = "--help" ] && { cat < marca alias como favorito zion ssh --desfavoritar remove dos favoritos Fonte dos hosts: ~/.ssh/config H exit 0; } mapfile -t hosts < <(awk 'tolower($1)=="host" && $2!~/[*?]/{for(i=2;i<=NF;i++)print $i}' "$CFG" 2>/dev/null) existe() { local a; for a in "${hosts[@]}"; do [ "$a" = "$1" ] && return 0; done; return 1; } is_fav() { [ -r "$FAV" ] && grep -qxF "$1" "$FAV"; } case "${1:-}" in --favoritar) [ -n "$2" ] || { echo "Informe o alias."; exit 2; } existe "$2" || { ui_err "alias '$2' nao existe em ~/.ssh/config"; exit 1; } is_fav "$2" && { ui_info "'$2' ja e favorito"; exit 0; } echo "$2" >> "$FAV" 2>/dev/null || { ui_err "sem permissao para escrever em $FAV"; exit 1; } ui_ok "'$2' adicionado aos favoritos"; exit 0 ;; --desfavoritar) [ -n "$2" ] || { echo "Informe o alias."; exit 2; } [ -w "$FAV" ] && { grep -vxF "$2" "$FAV" > "$FAV.tmp" 2>/dev/null && mv "$FAV.tmp" "$FAV"; } ui_ok "'$2' removido dos favoritos"; exit 0 ;; esac if [ ${#hosts[@]} -eq 0 ]; then ui_header "SERVIDORES SSH" ui_info "Nenhum servidor em ~/.ssh/config." printf ' Exemplo:\n %bHost meuserv\n HostName 100.x.y.z\n User pablo%b\n' "$ZGRY" "$ZR"; exit 0 fi # ordena: favoritos primeiro ordenados=(); for h in "${hosts[@]}"; do is_fav "$h" && ordenados+=("$h"); done for h in "${hosts[@]}"; do is_fav "$h" || ordenados+=("$h"); done testar() { local h hn lat for h in "$@"; do hn=$(ssh -G "$h" 2>/dev/null | awk '/^hostname /{print $2}') lat=$(ping -c1 -W1 "$hn" 2>/dev/null | grep -o 'time=[0-9.]*' | cut -d= -f2) printf ' %s%b%-16s%b %-22s %b\n' "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR" || printf ' ')" "$ZWHT" "$h" "$ZR" "$hn" "$([ -n "$lat" ] && printf '%b%sms%b' "$ZOK" "$lat" "$ZR" || ui_state off)" done } [ "$1" = "--testar" ] && { ui_header "SERVIDORES (teste)"; testar "${ordenados[@]}"; exit 0; } [ "$1" = "--favoritos" ] && { ui_header "FAVORITOS"; f=0; for h in "${ordenados[@]}"; do is_fav "$h" && { printf ' %b★ %s%b\n' "$ZWARN" "$h" "$ZR"; f=1; }; done; [ "$f" = 0 ] && ui_info "Nenhum favorito ainda."; exit 0; } ui_header "SERVIDORES SSH" i=0; for h in "${ordenados[@]}"; do i=$((i+1)); printf ' %b%2d)%b %s%s\n' "$ZA" "$i" "$ZR" "$(is_fav "$h" && printf '%b★%b ' "$ZWARN" "$ZR")" "$h"; done printf ' %b 0)%b voltar\n' "$ZA" "$ZR" read -r -p " Conectar em qual? " o [ "$o" = 0 ] && exit 0 [ "$o" -ge 1 ] 2>/dev/null && [ "$o" -le ${#ordenados[@]} ] || { echo "Opcao invalida."; exit 2; } alvo="${ordenados[$((o-1))]}" printf ' %bConectando em %s…%b\n' "$ZP" "$alvo" "$ZR"; exec ssh "$alvo"