disconoscimento
Se la tua connessione SSH non sopravvive a brevi interruzioni di rete, allora c'è qualcos'altro che non sta permettendossh
e TCP fa la cosa normale.
Vedi sotto per i dettagli. Comunque:
La soluzione senza dipendenze più rapida e sporca
Crea uno script shell come questo:
#!/bin/sh -
# Tune these numbers depending on how aggressively
# you want your SSH session to get reconnected.
timeout_options='-o ServerAliveInterval=4 -o ServerAliveCountMax=2'
# 255 is the status OpenSSH uses to signal SSH errors, which
# means we want to connect. All other exit statuses suggest
# an intentional exit.
status=255
# Keep opening the SSH connection and immediately dropping into
# `screen` until an intentional exit happens.
while [ "$status" = 255 ]
do
ssh $timeout_options -t "$@" screen -dR
status=$?
# You can add a `sleep` command here or a counter or whatever
# you might need as far as rate/retry limiting.
done
exit "$status"
Questo eseguirà solo un ciclo stupido-semplice che continua a provare a connettersi ssh
e connettersi screen
. Passa l'host o qualsiasi altra cosa che normalmente passeresti alla tua ssh
invocazione come argomenti da riga di comando.
La riconnessione si basa solo sul fatto che SSH segnala un errore con la connessione, il che significa che non ha intelligenza per rilevare errori non SSH come "non hai letteralmente acceso WiFI" o altro, ma probabilmente non importa per voi.
Suppongo che tu abbia ssh-agent
una chiave SSH senza passphrase che consentirà alle riconnessioni di funzionare semplicemente senza input aggiuntivo da parte tua.
Ci sarà una minuscola condizione di gara in cui se colpisci ^C
durante la giusta frazione umano impercettibile di secondo durante una riconnessione potresti finire per uccidere lo script invece di passare ^C
attraverso il terminale client, quindi se sospetti che la connessione si blocchi non schiacciare^C
troppo zelantemente.
La soluzione software aggiuntiva più semplice
Puoi provare il programma autossh , che dovrebbe essere disponibile nel tuo repository di pacchetti Ubuntu.
Se devi compilare dal sorgente o controllarlo, è un singolo programma C che si compila senza librerie aggiuntive come dipendenze, sembra avere più intelligenza sul controllo della vivacità della connessione rispetto al mio hack sopra, e viene fornito con un comodo rscreen
comando di script che auto -attacca a screen
.
Dettagli
Come ssh
normalmente recupera
Giusto per verificare, poiché non mi piace dire le cose senza controllarmi, ho eseguito un piccolo test prima di rispondere:
Ho ottenuto il mio WiFi con un dispositivo Linux, ho effettuato una connessione SSH a un altro dispositivo sulla mia LAN, verificato che avevo una ssh
connessione funzionante all'altra estremità (poteva eseguire comandi, ecc.), Quindi sul client ho disconnesso il WiFi (causando l'interfaccia da deconfigurare: niente più indirizzi IP), ho digitato un sacco di caratteri in più nella sessione ssh (nessuna risposta, ovviamente) e poi ricollegato al mio WiFi - la riconnessione in realtà non è riuscita almeno una volta a causa di un cattivo segnale e di altri fattori , poi finalmente riconnesso: ho aspettato circa cinque secondi per il ssh
ripristino della sessione, non è successo nulla, quindi ho premuto un altro tasto e la ssh
sessione è tornata immediatamente in vita, con tutti i tasti digitati durante la disconnessione che appaiono sulla riga di comando.
Vedi, ssh
scrive / legge nel socket di rete TCP fino a quando il sistema operativo non avverte che qualcosa è andato storto e TCP è in realtà molto tollerante nei confronti di interruzioni prolungate della connessione.
Lasciato ai propri dispositivi con le impostazioni del kernel predefinite, lo stack TCP in Linux tollererà felicemente che la connessione diventi completamente silenziosa per molti minuti prima di dichiarare la connessione interrotta e riportare un errore ssh
- al momento in cui si arrende finalmente stiamo parlando nel ballpark di ~ 30 minuti, o almeno sicuramente abbastanza a lungo per resistere al singhiozzo della connessione della durata di un secondo o un minuto.
Sotto le copertine, lo stack TCP Linux ritrova gradualmente i messaggi con ritardi sempre più lunghi, tuttavia, il che significa che, quando la connessione verrà ripristinata, potresti vedere un ulteriore ritardo prima che la ssh
sessione sembri tornare "viva".
Perché a volte questo si rompe
Spesso qualcosa provoca attivamente la chiusura della connessione dopo un periodo di inattività significativamente più breve rispetto alla quantità che lo stack TCP tollererà e quindi non riesce a riportare lo stato della connessione al ssh
client.
I candidati probabili includono:
Firewall o router NAT, che devono utilizzare la memoria per ricordare ogni connessione TCP attiva - come ottimizzazione e attenuazione degli attacchi DOS, a volte dimenticano semplicemente la connessione e quindi ignorano silenziosamente i conseguenti pacchetti, poiché i pacchetti nel nel mezzo di una connessione quando non ricordi che la connessione esistente sembra non valida.
I firewall / router meglio educati inietteranno un pacchetto TCP RST, che in genere si manifesta come un connection reset by peer
messaggio di errore, ma il pacchetto di ripristino è un incendio e dimentica, quindi se la connessione al client presenta ancora problemi in quel momento e interrompe il reimpostare anche il pacchetto, il client penserà che la connessione sia ancora attiva.
Il server stesso potrebbe avere una politica firewall per eliminare silenziosamente i pacchetti imprevisti, interrompendo i tentativi di ripresa della connessione del client ogni volta che il server ritiene che la connessione sia chiusa ma il client no: il client continua a provare a continuare la connessione, ma il server è solo ignorandolo perché non esiste una connessione attiva a cui appartengono questi pacchetti nello stato firewall del server.
Dal momento che stai usando Linux, controlla attentamente il tuo server iptables
/ ip6tables
(o nft
se stai usando le nuove cose) per esattamente quello che stai permettendo rispetto al rilascio. È molto comune consentire pacchetti nuovi / stabiliti / correlati sulla porta TCP SSH, ma non quelli " non validi" - se si rilascia silenziosamente tutto ciò che non è consentito, questa configurazione comune potrebbe causare questo tipo di blocchi dopo brevi problemi di connessione .
Il server SSH stesso potrebbe essere configurato per chiudere la connessione dopo un periodo di inattività, utilizzando una delle opzioni OpenSSH per i pacchetti keepalive client TCP o SSH. Di per sé questo non causerà blocchi indefiniti, ma può metterti in uno degli stati sopra descritti.
È possibile che tu non gli stia concedendo abbastanza tempo per "staccare" da solo dopo essere entrato nello stato in cui la ssh
sessione si blocca.
<Enter>
e digita~.
per dire al tuo lato di abbandonare la connessione e puoi semplicemente ripetere l'ultimo comando ssh per riconnetterti (ad esempio con la freccia su o!!
).