Como fechar (kill) ssh as conexões do ControlMaster manualmente

53

Com a seguinte configuração .ssh/config :

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

Como fechar a conexão persistente antes das 4 horas?

Eu sei que você pode fazer novas conexões, mas como fechá-las (tudo)?

Talvez exista uma maneira de mostrar todas as conexões persistentes e lidar com elas individualmente, mas não consigo encontrá-las.

    
por Paolo 05.11.2011 / 08:46

4 respostas

69

Do manual :

-O ctl_cmd
Control an active connection multiplexing master process. When the -O option is specified, the ctl_cmd argument is interpreted and passed to the master process. Valid commands are: check (check that the master process is running), forward (request forwardings without command execution), cancel (cancel forwardings), exit (request the master to exit), and stop (request the master to stop accepting further multiplexing requests).

As versões mais antigas têm apenas check e exit , mas isso é suficiente para o seu propósito.

ssh -O check host.example.com

Se você quiser excluir todas as conexões (não apenas a conexão com um determinado host) de uma só vez, então fuser /tmp/ssh_mux_* ou lsof /tmp/ssh_mux_* listará os clientes ssh que estão controlando cada soquete. Use fuser -HUP -k tmp/ssh_mux_* para eliminá-los de forma limpa (usando SIGHUP, pois o sinal é melhor, pois permite que os clientes removam adequadamente o soquete).

    
por 05.11.2011 / 18:20
9

Eu escrevi um utilitário de código aberto, cmc , para gerenciar as sessões do 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
    
por 18.02.2013 / 17:10
3

Você pode executar fuser /tmp/ssh_mux_blablabla (possível precisando de sudo ) e matar o PID que ele retorna. fuser mostra quais processos estão usando um arquivo. (E mais, confira man fuser .)

Atualização: confira a resposta de Gilles; é muito mais detalhado.

    
por 05.11.2011 / 15:01
0

Isso funciona para mim usando apenas o arquivo de soquete para o mestre de controle:

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

Exemplo

Aqui está um exemplo em que já estabeleci uma conexão com um servidor remoto:

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

E com isso desconectado:

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

Se ainda estivesse conectado, isso forçaria a saída imediata:

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

Não está claro para mim, mas parece ser um bug em ssh que requer um argumento adicional no final, mesmo que blah não tenha sentido no contexto dos switches que estou usando. / p>

Sem isso me dá isso:

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

Informações da versão

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

Confirmei que em ambas as versões, a necessidade do argumento falso adicional era necessária.

Referências

por 31.07.2018 / 01:30