Comment fermer (tuer) les connexions ControlMaster ssh manuellement

63

Avec la .ssh/configconfiguration suivante :

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

Comment fermer la connexion persistante avant les 4 heures?

Je sais que vous pouvez créer de nouveaux liens, mais comment les fermer (tous)?

Peut-être y at-il un moyen de montrer toutes les connexions persistantes et de les gérer individuellement mais je ne le trouve pas.

Paolo
la source
4
Ne le tuez pas, mais vous ne pouvez tout simplement pas utiliser la connexion persistante via ssh -S none(peut-être que cela vous aide déjà).
Sr.
Non, j'essaie de supprimer un utilisateur sur un serveur distant, mais les connexions suspendues m'empêchent de le faire.
Paolo

Réponses:

81

Du manuel :

-O ctl_cmd
Contrôler un processus maître de multiplexage de connexion active. Lorsque l' -Ooption est spécifiée, l' ctl_cmdargument est interprété et transmis au processus maître. Les commandes valides sont: check (vérifier que le processus maître est en cours d'exécution), forward(demander les transferts sans exécution de commande), cancel(annuler les transferts), exit(demander au maître de quitter) et stop (demander au maître de cesser d'accepter des demandes de multiplexage supplémentaires).

Les anciennes versions ont seulement checket exit, mais cela suffit pour votre objectif.

ssh -O check host.example.com

Si vous souhaitez supprimer toutes les connexions (pas seulement la connexion à un hôte particulier) en un seul coup, alors fuser /tmp/ssh_mux_*ou lsof /tmp/ssh_mux_*listera les clients ssh qui contrôlent chaque socket. Utilisez-les fuser -HUP -k tmp/ssh_mux_*pour les tuer tous proprement (utilisez SIGHUP car le signal est meilleur car il permet aux clients de retirer correctement leur socket).

Gilles, arrête de faire le mal
la source
C'est une excellente réponse. C'est parfait pour ce que j'essayais de réaliser. checkest encore plus utile que ce que je cherchais, c’est ce qui se exitpasse quand même! : D
ELLIOTTCABLE
5
Sous OS X, fuservous ne pouvez pas envoyer de signaux, mais cela fonctionne tout aussi bien:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori, le
11

J'ai écrit un utilitaire open source cmcpour gérer les sessions 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
la source
3

Vous pouvez exécuter fuser /tmp/ssh_mux_blablabla(si nécessaire sudo) et supprimer le PID renvoyé. fusermontre quels processus utilisent un fichier. (Et plus encore, consultez man fuser.)

Mise à jour: consultez la réponse de Gilles; c'est beaucoup plus détaillé.

Janmoesen
la source
3

Cela fonctionne pour moi en utilisant uniquement le fichier de socket pour le maître de contrôle:

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

Exemple

Voici un exemple où j'ai déjà établi une connexion à un serveur distant:

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

Et avec cela déconnecté:

$ ssh -o ControlPath=~/.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 à sortir immédiatement:

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

Ce n'est pas clair pour moi, mais il semblerait qu'il s'agisse d'un bogue dans la mesure ssh où il nécessite un argument supplémentaire à la fin, même si cela blahn'a pas de sens dans le contexte des commutateurs que j'utilise.

Sans ça me donne ceci:

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

Informations de 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, la nécessité de l'argument supplémentaire faux était nécessaire.

Références

slm
la source