Simplemente podría usar
ssh -o ControlPath=$socket -O check
por cada $socket que haya abierto (fácil si los guarda en un solo directorio).
Esto devuelve 255 si la verificación falla (la conexión ya no está activa), otro valor si pasa. Es posible que también deba especificar el nombre de host, pero nada que un awk en $socket no le proporcione :)
La respuesta de @Renik no funcionó para mí. Vea a continuación lo que hizo.
Esto funciona para mí usando solo el archivo de socket para el maestro de control:
$ ssh -o ControlPath=~/.ssh/<controlfile> -O check <bogus arg>
ssh -S ~/.ssh/<controlfile> ...
también, que es una forma un poco más corta de lo anterior.
Ejemplo
Aquí hay un ejemplo en el que ya he establecido una conexión a un servidor remoto:
$ ssh -S ~/.ssh/master-57db26a0499dfd881986e23a2e4dd5c5c63e26c2 -O check blah
Master running (pid=89228)
$
Y con él desconectado:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O check blah
Control socket connect(/Users/user1/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74): No such file or directory
$
Si todavía estuviera conectado, esto lo obligaría a salir de inmediato:
$ ssh -S ~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$
No me queda claro, pero parece que podría tratarse de un error en ssh
que requiere un argumento adicional al final, aunque blah
no tiene sentido en el contexto de los interruptores que estoy usando.
Sin me da esto:
$ 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]
Información de la versión
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
Confirmé que en ambas versiones, se requería la necesidad del argumento falso adicional.
Referencias
- Cómo cerrar (matar) conexiones ssh ControlMaster manualmente
- ¿Cómo salir del proceso maestro de control de OpenSSH sin usar lsof o fuser?