Jak ręcznie zamknąć (zabić) połączenia ssh ControlMaster


63

Dzięki następującej .ssh/configkonfiguracji:

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

Jak zamknąć stałe połączenie przed 4 godzinami?

Wiem, że możesz nawiązywać nowe połączenia, ale jak je zamknąć (wszystkie)?

Być może istnieje sposób, aby pokazać wszystkie utrwalone połączenia i obsłużyć je indywidualnie, ale nie mogę tego znaleźć.


4
Nie zabijanie go, ale po prostu nie możesz użyć stałego połączenia przez ssh -S none(być może to już ci pomaga).
sr_

Nie, próbuję usunąć użytkownika ze zdalnego serwera, ale wiszące połączenia uniemożliwiają mi to.
Paolo,

Odpowiedzi:


81

Z instrukcji :

-O ctl_cmd
Kontroluj proces główny multipleksowania aktywnego połączenia. Po określeniu -Oopcji ctl_cmdargument jest interpretowany i przekazywany do procesu głównego. Prawidłowe polecenia to: check (sprawdź, czy proces główny działa), forward(żądaj przekazywania bez wykonania polecenia), cancel(anuluj przekazywanie), exit(poproś master o zakończenie) i stop (poproś master, aby przestał akceptować dalsze żądania multipleksowania).

Starsze wersje mają tylko checki exit, ale to wystarczy do twojego celu.

ssh -O check host.example.com

Jeśli chcesz usunąć wszystkie połączenia (nie tylko połączenie z konkretnym hostem) za jednym zamachem, to fuser /tmp/ssh_mux_*lub lsof /tmp/ssh_mux_*wyświetli listę klientów ssh, którzy kontrolują każde gniazdo. Użyj, fuser -HUP -k tmp/ssh_mux_*aby zabić ich wszystkich czysto (używając SIGHUP, ponieważ sygnał jest najlepszy, ponieważ pozwala klientom prawidłowo usunąć swoje gniazdo).


To doskonała odpowiedź. Jest to idealne rozwiązanie do tego, co próbowałem osiągnąć. checkjest nawet bardziej przydatny niż to, czego szukałem, co exitzresztą działa! : D
ELLIOTTCABLE,

5
W OS X fusernie można wysyłać sygnałów, ale działa to równie dobrze:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

Napisałem narzędzie open source cmcdo zarządzania sesjami 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

3

Możesz uruchomić fuser /tmp/ssh_mux_blablabla(możliwe, że trzeba sudo) i zabić PID, który on zwraca. fuserpokazuje, które procesy używają pliku. (I więcej, sprawdź man fuser.)

Aktualizacja: sprawdź odpowiedź Gillesa; jest o wiele bardziej szczegółowy.


3

Działa to dla mnie przy użyciu tylko pliku gniazda dla wzorca sterowania:

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

Przykład

Oto przykład, w którym nawiązałem już połączenie ze zdalnym serwerem:

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

A przy odłączonym:

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

Jeśli nadal byłby podłączony, zmusiłoby go to do natychmiastowego wyjścia:

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

Nie jest to dla mnie jasne, ale wydaje się, że to potencjalnie błąd ssh , ponieważ wymaga dodatkowego argumentu na końcu, mimo że blahjest bez znaczenia w kontekście przełączników, których używam.

Bez tego daje mi to:

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

Informacje o wersji

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

Potwierdziłem, że w obu tych wersjach wymagana była dodatkowa nieprawdziwa argumentacja.

Bibliografia

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.