So schließen (beenden) Sie ssh ControlMaster-Verbindungen manuell

63

Mit folgender .ssh/configKonfiguration:

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

Wie schließe ich die bestehende Verbindung vor den 4 Stunden?

Ich weiß, dass Sie neue Verbindungen herstellen können, aber wie können Sie sie (alle) schließen?

Vielleicht gibt es eine Möglichkeit, alle bestehenden Verbindungen anzuzeigen und einzeln zu behandeln, aber ich kann sie nicht finden.

Paolo
quelle
4
Nicht töten, aber Sie können einfach nicht die bestehende Verbindung über ssh -S none(vielleicht hilft Ihnen das schon).
Sr_
Nein, ich versuche, einen Benutzer von einem Remote-Server zu entfernen, aber die hängenden Verbindungen hindern mich daran.
Paolo

Antworten:

81

Aus dem Handbuch :

-O ctl_cmd
Steuern Sie einen aktiven Verbindungs-Multiplexing-Master-Prozess. Wenn die -OOption angegeben wird, wird das ctl_cmdArgument interpretiert und an den Master-Prozess übergeben. Gültige Befehle sind: check (Vergewissern Sie sich, dass der Master-Prozess ausgeführt wird), forward(Weiterleitungen ohne Befehlsausführung anfordern), cancel(Weiterleitungen abbrechen), exit(Verlassen stop des Masters anfordern) und ( Verlassen der Annahme weiterer Multiplexanforderungen durch den Master).

Ältere Versionen haben nur checkund exit, aber das reicht für Ihren Zweck.

ssh -O check host.example.com

Wenn Sie alle Verbindungen löschen (nicht nur die Verbindung zu einem bestimmten Host) auf einen Schlag, dann fuser /tmp/ssh_mux_*oder lsof /tmp/ssh_mux_*werden die SSH - Clients auflisten , die jede Buchse steuern. Verwenden Sie fuser -HUP -k tmp/ssh_mux_*diese Option, um sie alle sauber zu töten (verwenden Sie SIGHUP als das beste Signal, damit die Clients ihren Socket ordnungsgemäß entfernen können).

Gilles 'SO - hör auf böse zu sein'
quelle
Dies ist eine hervorragende Antwort. Dies ist perfekt für das, was ich erreichen wollte. checkist noch nützlicher als das, was ich gesucht habe, was exitsowieso macht! : D
ELLIOTTCABLE
5
Unter OS X fuserkönnen keine Signale gesendet werden, aber das funktioniert genauso gut:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori
11

Ich habe ein Open Source-Dienstprogramm geschrieben, cmcum ControlMaster-Sitzungen zu verwalten: 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
quelle
3

Sie können die zurückgegebene PID ausführen fuser /tmp/ssh_mux_blablabla(falls erforderlich sudo) und löschen. fuserZeigt an, welche Prozesse eine Datei verwenden. (Und mehr, check out man fuser.)

Update: Schauen Sie sich Gilles 'Antwort an. es ist viel detaillierter.

janmoesen
quelle
3

Das funktioniert bei mir nur mit der Socket-Datei für den Control Master:

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

Beispiel

Hier ist ein Beispiel, in dem ich bereits eine Verbindung zu einem Remoteserver hergestellt habe:

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

Und damit getrennt:

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

Wenn es immer noch verbunden wäre, würde dies das sofortige Beenden erzwingen:

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

Es ist mir unklar, aber es scheint möglicherweise ein Fehler zu sein ssh , der am Ende ein zusätzliches Argument erfordert, obwohl blahes im Kontext der von mir verwendeten Schalter bedeutungslos ist.

Ohne es gibt mir das:

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

Versions Information

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

Ich bestätigte, dass für beide Versionen das zusätzliche Scheinargument erforderlich war.

Verweise

slm
quelle