La configurazione
mkdir -m 700 ~/.ssh/cm
Host server
HostName example.com
User user
ControlMaster auto
ControlPath ~/.ssh/cm/%C
ControlPersist 10m
ControlMaster autousa una connessione esistente se c'è, altrimenti ne apre una nuova che gli altri possono condividere.ControlPathè il file socket che le sessioni usano per trovare la connessione.%Cè un hash di host locale, host remoto, porta, utente e jump host, così login diversi non si confondono.ControlPersist 10mtiene aperta la connessione per 10 minuti dopo la fine dell'ultima sessione. Conno, il valore predefinito, la connessione vive dentro il primosshche hai avviato, che resta aperto finché non sono finite tutte le sessioni che la usano. Conyes, resta aperta finché non la chiudi.
Nel nostro test, tra due container sulla stessa macchina, il primo ssh server true ha impiegato 74 ms e il secondo 3 ms. Il secondo salta lo scambio di chiavi e il login, quindi non compare nemmeno una nuova richiesta di password o passphrase. Su una rete reale il primo login è più lento, quindi il divario è maggiore.
Lo stesso blocco può contenere le altre impostazioni dell'host. Per saperne di più, vedi esempi del file config di SSH.
Controllare la connessione
| Comando | Cosa fa |
|---|---|
ssh -O check server | Stampa Master running (pid=1534), codice di uscita 0 |
ssh -O conninfo server | Mostra gli indirizzi e gli algoritmi della connessione |
ssh -O forward -L 8080:localhost:80 server | Aggiunge un inoltro di porta alla connessione aperta |
ssh -O cancel -L 8080:localhost:80 server | Rimuove quell'inoltro |
ssh -O stop server | Non accetta nuove sessioni, quelle in corso continuano |
ssh -O exit server | Chiude la connessione e tutte le sessioni che passano da lì |
ssh -S none server | Apre una connessione separata e ignora quella condivisa |
Quando non c'è nulla in esecuzione, -O check esce con codice 255:
Control socket connect(/home/user/.ssh/cm/936446a2...): No such file or directory
Limiti e trappole
Tutte le sessioni hanno lo stesso destino
Se la connessione muore, muoiono tutte le sessioni che la usano. Nel nostro test, ssh -O exit ha terminato una sessione in corso con codice di uscita 255. Anche la sequenza di escape ~. termina tutte le sessioni della connessione, come dice lo stesso ssh nel suo elenco ~?.
Il server limita le sessioni per connessione
MaxSessions in sshd_config vale 10 per impostazione predefinita. Abbiamo aperto 12 sessioni insieme e le ultime 2 sono fallite con:
mux_client_request_session: session request failed: Session open refused by peer
Quei comandi sono falliti del tutto. Non sono passati a una nuova connessione, quindi gli script che lanciano molti comandi in parallelo hanno bisogno di un limite più alto o di -S none.
Il percorso del socket può essere troppo lungo
I percorsi dei socket Unix hanno un limite di lunghezza ridotto. Un percorso troppo lungo blocca la connessione:
unix_listener: path "/very/long/path/..." too long for Unix domain socket
Una cartella corta con %C evita il problema. L'hash ha una lunghezza fissa, a differenza di %r@%h:%p.
Il socket dà accesso senza login
Chiunque possa usare il file socket può aprire sessioni sulla tua connessione senza password. Tienilo in una cartella in cui solo tu puoi scrivere, ed è per questo che ~/.ssh/cm ha modo 700. Anche il manuale lo segnala.
I tunnel di lunga durata dovrebbero avere una connessione propria
Un inoltro avviato tramite una connessione condivisa appartiene al master. Nel nostro test, con il multiplexing attivo, un secondo ssh -f -N -o ExitOnForwardFailure=yes -R 2222:localhost:22 server su una porta già in uso ha restituito codice di uscita 0. Senza multiplexing, lo stesso comando ha stampato un errore e ha restituito 255. Per un tunnel da cui dipendono degli script, aggiungi -S none.
Un master terminato a forza lascia un socket orfano
Dopo un kill -9 sul master, il file socket resta e -O check segnala Connection refused. Nel nostro test il successivo ssh server normale ha funzionato lo stesso e ha sostituito il socket. Se mai si blocca, elimina il file in ~/.ssh/cm.
Domande
Il multiplexing SSH è sicuro?
Sì, se il socket sta in una cartella in cui puoi scrivere solo tu, come ~/.ssh/cm con permessi 700. Chiunque possa usare il socket può aprire sessioni sulla tua connessione senza accedere.
ControlMaster funziona con il client OpenSSH di Windows?
Il client OpenSSH incluso in Windows non supporta ControlMaster, perché si basa sui socket di dominio Unix. Funziona in WSL.
Come chiudo una connessione SSH condivisa?
Esegui ssh -O exit con il nome dell'host. Chiude la connessione e tutte le sessioni che la usano. ssh -O stop rifiuta nuove sessioni e lascia finire quelle in corso.