opt/zion-terminal/bin/zion-ssh (view raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
#!/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 <<H
Uso: zion ssh menu de servidores (favoritos primeiro)
zion ssh --testar testa latencia de todos sem conectar
zion ssh --favoritos lista so os favoritos
zion ssh --favoritar <a> marca alias como favorito
zion ssh --desfavoritar <a> 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"
|