Come chiudere (uccidere) le connessioni ControlMaster ssh manualmente


63

Con la seguente .ssh/configconfigurazione:

ControlMaster auto
ControlPath /tmp/ssh_mux_%h_%p_%r
ControlPersist 4h

Come chiudere la connessione persistente prima delle 4 ore?

So che puoi creare nuove connessioni, ma come chiuderle (tutte)?

Forse c'è un modo per mostrare tutte le connessioni persistenti e gestirle singolarmente ma non riesco a trovarlo.


4
Non ucciderlo, ma semplicemente non puoi usare la connessione persistente tramite ssh -S none(forse questo ti aiuta già).
sr_

No, sto cercando di rimuovere un utente su un server remoto, ma le connessioni sospese mi impediscono di farlo.
Paolo,

Risposte:


81

Dal manuale :

-O ctl_cmd
Controllare un processo master multiplexing di connessione attiva. Quando -Oviene specificata l' opzione, l' ctl_cmdargomento viene interpretato e passato al processo principale. I comandi validi sono: check (controlla che il processo principale sia in esecuzione), forward(richiedi inoltri senza esecuzione del comando), cancel(annulla inoltri), exit(richiedi al master di uscire) e stop (richiedi al master di smettere di accettare ulteriori richieste di multiplexing).

Le versioni precedenti hanno solo checke exit, ma è abbastanza per il tuo scopo.

ssh -O check host.example.com

Se si desidera eliminare tutte le connessioni (non solo la connessione a un determinato host) in un colpo solo, allora fuser /tmp/ssh_mux_*o lsof /tmp/ssh_mux_*verranno elencati i client SSH che controllano ciascun socket. Usa fuser -HUP -k tmp/ssh_mux_*per ucciderli tutti in modo pulito (usando SIGHUP come segnale è il migliore in quanto consente ai client di rimuovere correttamente il loro socket).


Questa è una risposta eccellente Questo è perfetto per quello che stavo cercando di ottenere. checkè ancora più utile di quello che stavo cercando, che è exitcomunque ciò che fa! : D
ELLIOTTCABLE

5
In OS X fusernon è possibile inviare segnali, ma funziona altrettanto bene:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

Ho scritto un'utilità open source cmc, per gestire le sessioni ControlMaster: ClockworkNet / cmc :

Usage:  cmc [ -c HOST | -o HOST | -x HOST ]
        cmc [ -L | -l | -O | -X ]
        cmc -h

ControlMaster Controller - Eases management of SSH ControlMaster connections

Options:
    -h      show this help message and exit
    -c HOST check HOST ControlMaster connection status (maybe specified more
            than once)
    -L      list ControlMasters defined in SSH_CONFIG
    -l      list ControlMaster connection sockets in ~/.ssh/ and check their
            connection status
    -O      open all ControlMasters defined in SSH_CONFIG
    -o HOST open a ControlMaster session (maybe specified more than once)
    -x HOST close ControlMaster session (maybe specified more than once)
    -X      exit all ControlMaster connections with sockets in ~/.ssh/

Notes:
    * Any unopened sockets in ~/.ssh/ are removed with -l and -X

3

È possibile eseguire fuser /tmp/ssh_mux_blablabla(eventualmente necessario sudo) ed eliminare il PID che restituisce. fusermostra quali processi stanno utilizzando un file. (E altro, controlla man fuser.)

Aggiornamento: controlla la risposta di Gilles; è molto più dettagliato.


3

Questo funziona per me usando solo il file socket per il controllo master:

$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>

Esempio

Ecco un esempio in cui ho già stabilito una connessione a un server remoto:

$ ssh -o ControlPath=~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$

E con esso disconnesso:

$ ssh -o ControlPath=~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$

Se fosse ancora connesso, questo lo costringerebbe ad uscire immediatamente:

$ ssh -o ControlPath=~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$

Non è chiaro per me, ma sembrerebbe potenzialmente un bug in ssh quanto richiede un argomento aggiuntivo alla fine, anche se non ha blahsenso nel contesto degli switch che sto usando.

Senza questo mi dà questo:

$ ssh -o ControlPath=~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check
usage: ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec]
           [-D [bind_address:]port] [-E log_file] [-e escape_char]
           [-F configfile] [-I pkcs11] [-i identity_file]
           [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec]
           [-O ctl_cmd] [-o option] [-p port]
           [-Q cipher | cipher-auth | mac | kex | key]
           [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] [user@]hostname [command]

Informazioni sulla versione

OSX
$ ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8
CentOS 7.x
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

Ho confermato che su entrambe queste versioni era necessaria la necessità di ulteriori argomenti fasulli.

Riferimenti

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.