Vous pouvez simplement utiliser
ssh -o ControlPath=$socket -O check
pour chaque $socket que vous avez ouvert (facile si vous les gardez dans un seul répertoire).
Cela renvoie 255 si la vérification échoue (la connexion n'est plus active), une autre valeur si elle réussit. Vous devrez peut-être également spécifier le nom d'hôte, mais rien qu'un awk sur $socket ne vous donnera :)
La réponse de @Renik n'a pas fonctionné pour moi. Voir ci-dessous pour ce qui a fait.
Cela fonctionne pour moi en utilisant uniquement le fichier socket pour le maître de contrôle :
$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
REMARQUE : Vous pouvez également utiliser ssh -S ~/.ssh/<controlfile> ...
ainsi, qui est une forme un peu plus courte de ce qui précède.
Exemple
Voici un exemple où j'ai déjà établi une connexion à un serveur distant :
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$
Et avec celui-ci déconnecté :
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$
S'il était toujours connecté, cela le forcerait à quitter immédiatement :
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$
Ce n'est pas clair pour moi, mais il semblerait qu'il s'agisse potentiellement d'un bogue dans ssh
qu'il nécessite un argument supplémentaire à la fin, même si blah
n'a pas de sens dans le contexte des commutateurs que j'utilise.
Sans ça me donne ça :
$ 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]
Informations sur la version
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
J'ai confirmé que sur ces deux versions, le besoin du faux argument supplémentaire était requis.
Références
- Comment fermer (tuer) les connexions ssh ControlMaster manuellement
- Comment quitter le processus maître de contrôle OpenSSH sans utiliser lsof ou fuser ?