Cómo cerrar (matar) las conexiones ssh ControlMaster manualmente

63

Con la siguiente .ssh/configconfiguración:

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

¿Cómo cerrar la conexión persistente antes de las 4 horas?

Sé que puedes hacer nuevas conexiones, pero ¿cómo cerrarlas (todas)?

Quizás haya una manera de mostrar todas las conexiones persistentes y manejarlas individualmente, pero no puedo encontrarlas.

Paolo
fuente
44
No lo mata, pero simplemente no puede usar la conexión persistente a través de ssh -S none(tal vez esto ya lo ayude).
Sr_
No, estoy tratando de eliminar un usuario en un servidor remoto, pero las conexiones colgantes me impiden hacerlo.
Paolo

Respuestas:

81

Del manual :

-O ctl_cmd
Controle un proceso maestro de multiplexación de conexión activa. Cuando -Ose especifica la opción, el ctl_cmdargumento se interpreta y se pasa al proceso maestro. Los comandos válidos son: check (verifique que el proceso maestro se esté ejecutando), forward(solicite reenvíos sin ejecución de comando), cancel(cancele reenvíos), exit(solicite al maestro que salga) y stop (solicite al maestro que deje de aceptar más solicitudes de multiplexación).

Las versiones anteriores solo tienen checky exit, pero eso es suficiente para su propósito.

ssh -O check host.example.com

Si desea eliminar todas las conexiones (no solo la conexión a un host en particular) de una sola vez, fuser /tmp/ssh_mux_*o lsof /tmp/ssh_mux_*enumerará los clientes ssh que controlan cada socket. Úselo fuser -HUP -k tmp/ssh_mux_*para matarlos a todos limpiamente (usar SIGHUP como señal es mejor ya que permite que los clientes retiren adecuadamente su zócalo).

Gilles 'SO- deja de ser malvado'
fuente
Esta es una excelente respuesta. Esto es perfecto para lo que estaba tratando de lograr. checkes aún más útil que lo que estaba buscando, ¡que es lo que exithace de todos modos! : D
ELLIOTTCABLE
55
En OS X fuserno puedo enviar señales, pero esto funciona igual de bien:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori
11

Escribí una utilidad de código abierto cmcpara administrar las sesiones de 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
TimZehta
fuente
3

Puede ejecutar fuser /tmp/ssh_mux_blablabla(posible necesidad sudo) y matar el PID que devuelve. fusermuestra qué procesos están usando un archivo. (Y más, echa un vistazo man fuser).

Actualización: mira la respuesta de Gilles; Es mucho más detallado.

janmoesen
fuente
3

Esto funciona para mí usando solo el archivo de socket para el maestro de control:

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

Ejemplo

Aquí hay un ejemplo donde ya he establecido una conexión a un servidor remoto:

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

Y con eso desconectado:

$ ssh -o ControlPath=~/.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 -o ControlPath=~/.ssh/master-66496a62823573e4760469df70e57ce4c15afd74 -O exit blah
Exit request sent.
$

Para mí no está claro, pero parece ser potencialmente un error, ya ssh que requiere un argumento adicional al final, a pesar de que no blahtiene sentido en el contexto de los interruptores que estoy usando.

Sin eso me da esto:

$ 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]

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

slm
fuente