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

63

Com a seguinte .ssh/configconfiguração:

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 (todas)?

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

Paolo
fonte
4
Não o mate, mas você simplesmente não pode usar a conexão persistente via ssh -S none(talvez isso já o ajude).
sr_
Não, estou tentando remover um usuário em um servidor remoto, mas as conexões suspensas me impedem de fazê-lo.
Paolo

Respostas:

81

Do manual :

-O ctl_cmd
Controlar um processo mestre de multiplexação de conexão ativa. Quando a -Oopção é especificada, o ctl_cmdargumento é interpretado e passado para o processo mestre. Os comandos válidos são: check (verifique se o processo mestre está em execução), forward(solicite encaminhamentos sem execução de comando), cancel(cancele encaminhamentos), exit(solicite a saída do mestre) e stop (solicite que o mestre pare de aceitar outras solicitações de multiplexação).

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

ssh -O check host.example.com

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

Gilles 'SO- parar de ser mau'
fonte
Esta é uma excelente resposta. Isso é perfeito para o que eu estava tentando alcançar. checké ainda mais útil do que o que eu estava procurando, que é o que exitfaz de qualquer maneira! : D
ELLIOTTCABLE
5
No OS X fusernão é possível enviar sinais, mas isso também funciona:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori
11

Escrevi um utilitário de código aberto cmc,, para gerenciar 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
TimZehta
fonte
3

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

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

janmoesen
fonte
3

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 eu já estabeleci uma conexão com um servidor remoto:

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

E com ele 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 o forçaria a sair imediatamente:

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

Não está claro para mim, mas parece ser um bug em potencial, ssh pois requer um argumento adicional no final, mesmo sem blahsentido no contexto dos comutadores que estou usando.

Sem isso me dá o seguinte:

$ 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ção 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, era necessária a necessidade de um argumento falso adicional.

Referências

slm
fonte