Potresti semplicemente usare
ssh -o ControlPath=$socket -O check
per ogni $socket che hai aperto (facile se li mantieni in un'unica directory).
Questo restituisce 255 se il controllo fallisce (connessione non più attiva), un altro valore se passa. Potrebbe essere necessario specificare anche il nome host, ma niente che un awk su $socket non ti dia :)
La risposta di @Renik non ha funzionato per me. Vedi sotto per cosa ha fatto.
Questo funziona per me usando solo il file socket per il master di controllo:
$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
NOTA: Puoi anche usare ssh -S ~/.ssh/<controlfile> ...
anche, che è una forma un po' più breve di quanto sopra.
Esempio
Ecco un esempio in cui ho già stabilito una connessione a un server remoto:
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$
E con esso disconnesso:
$ ssh -S ~/.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 a uscire immediatamente:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$
Non mi è chiaro, ma sembrerebbe essere potenzialmente un bug in ssh
che richiede un argomento aggiuntivo alla fine, anche se blah
non ha senso nel contesto degli switch che sto usando.
Senza di esso mi dà questo:
$ ssh -S ~/.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]] [[email protected]]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 richiesta la necessità dell'argomento fasullo aggiuntivo.
Riferimenti
- Come chiudere (uccidere) le connessioni ssh ControlMaster manualmente
- Come uscire dal processo master di controllo OpenSSH senza utilizzare lsof o fuser?