onboard: le chiavi dei server in known_hosts, e verifica dice perche' non entri

Marco Laterza, amministratore, si e' visto dire "produzione: non entri
(normale se non hai il ruolo di rilascio...)" con la chiave gia' sul
server: al suo PC mancava la chiave host della macchina nuova, e con
BatchMode=yes ssh rifiuta un host sconosciuto senza provare la chiave.

configura.sh scrive in ~/.ssh/known_hosts le chiavi di server.known_hosts,
lette sulle tre macchine l'08/10/2026, togliendo prima quelle vecchie per
gli stessi nomi. verifica.sh legge l'errore di ssh: giallo solo se il
server rifiuta la chiave personale, rosso con il rimedio per chiave host
mancante o cambiata e per il blocco dopo troppi tentativi.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Fabio
2026-10-08 10:47:10 +02:00
co-authored by Claude Opus 5.5
parent 2a4dbf3ad2
commit b83fc9883d
4 changed files with 79 additions and 18 deletions
+30 -15
View File
@@ -68,33 +68,48 @@ porta_aperta () {
kill "$sveglia" 2> /dev/null
return "$esito"
}
# Un tentativo, e il motivo se non si entra: "non entri" da solo faceva
# pensare ai ruoli anche quando mancava la chiave del server su questo PC.
# Esce 0 se si entra, 1 se e' la chiave tua, 2 se e' altro (scritto in MOTIVO).
entra () {
local errore
errore="$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$1" true 2>&1 > /dev/null)" && return 0
case "$errore" in
*"Permission denied"*) return 1 ;;
*"Host key verification failed"*|*"IDENTIFICATION HAS CHANGED"*)
MOTIVO="questo PC non ha la chiave giusta del server: rilancia ./configura.sh, che la registra" ;;
*"Connection closed"*|*"Connection reset"*)
MOTIVO="il server ha chiuso la connessione: dopo troppi tentativi sbagliati la chiude per qualche minuto, aspetta e rilancia" ;;
*) MOTIVO="ssh dice: $(printf '%s\n' "$errore" | grep -v '^\*\*' | tail -1)" ;;
esac
return 2
}
if porta_aperta "$STAGING_HOST" 22 ; then
ok "VPN attiva (staging raggiungibile)"
if ssh -o BatchMode=yes -o ConnectTimeout=8 "$STAGING_NOME" true 2> /dev/null ; then
ok "entri su staging ($STAGING_NOME)"
else
rosso "staging non accetta la tua chiave: l'amministratore deve ancora aggiungerla"
fi
entra "$STAGING_NOME" ; ESITO=$?
if [ "$ESITO" = "0" ] ; then ok "entri su staging ($STAGING_NOME)"
elif [ "$ESITO" = "1" ] ; then rosso "staging non accetta la tua chiave: l'amministratore deve ancora aggiungerla"
else rosso "staging ($STAGING_NOME): $MOTIVO" ; fi
else
rosso "staging non raggiungibile: la VPN e' accesa?"
fi
# Le produzioni sono due finche' i siti non sono migrati tutti. La nuova sta
# dietro la stessa VPN di staging. Un tentativo solo per macchina: la nuova
# chiude le porte per un po' a chi sbaglia il login piu' volte di fila.
# Solo il rifiuto della chiave dipende dal ruolo: il resto si sistema da qui.
NON_AUTORIZZATO="il server non accetta la tua chiave (normale se non hai il ruolo di rilascio; se ce l'hai, chiedi a chi amministra di aggiungerla)"
if porta_aperta "$PRODUZIONE_HOST" 22 ; then
if ssh -o BatchMode=yes -o ConnectTimeout=8 "$PRODUZIONE_NOME" true 2> /dev/null ; then
ok "entri in produzione ($PRODUZIONE_NOME)"
else
attento "produzione ($PRODUZIONE_NOME): non entri (normale se non hai il ruolo di rilascio, o se la tua chiave non e' ancora stata aggiunta)"
fi
entra "$PRODUZIONE_NOME" ; ESITO=$?
if [ "$ESITO" = "0" ] ; then ok "entri in produzione ($PRODUZIONE_NOME)"
elif [ "$ESITO" = "1" ] ; then attento "produzione ($PRODUZIONE_NOME): $NON_AUTORIZZATO"
else rosso "produzione ($PRODUZIONE_NOME): $MOTIVO" ; fi
else
attento "produzione ($PRODUZIONE_NOME): non raggiungibile (sta dietro la VPN, come staging)"
fi
if ssh -o BatchMode=yes -o ConnectTimeout=8 "$PRODUZIONE_VECCHIA_NOME" true 2> /dev/null ; then
ok "entri nella produzione vecchia ($PRODUZIONE_VECCHIA_NOME)"
else
attento "produzione vecchia ($PRODUZIONE_VECCHIA_NOME): non entri (normale se non hai il ruolo di rilascio, o se la tua chiave non e' ancora stata aggiunta)"
fi
entra "$PRODUZIONE_VECCHIA_NOME" ; ESITO=$?
if [ "$ESITO" = "0" ] ; then ok "entri nella produzione vecchia ($PRODUZIONE_VECCHIA_NOME)"
elif [ "$ESITO" = "1" ] ; then attento "produzione vecchia ($PRODUZIONE_VECCHIA_NOME): $NON_AUTORIZZATO"
else rosso "produzione vecchia ($PRODUZIONE_VECCHIA_NOME): $MOTIVO" ; fi
titolo "Risultato"
if [ "$ROSSI" = "0" ] ; then