Як закрити (вбити) з'єднання ssh ControlMaster вручну


63

З такою .ssh/configконфігурацією:

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

Як закрити постійне з'єднання до 4 годин?

Я знаю, ви можете встановити нові зв’язки, але як їх закрити (усі)?

Можливо, є спосіб показати всі збережені з'єднання та обробити їх окремо, але я не можу його знайти.


4
Не вбиваючи це, але ви просто не можете використовувати стійкий зв’язок через ssh -S none(можливо, це вам вже допомагає).
sr_

Ні, я намагаюся видалити користувача на віддаленому сервері, але висячі з'єднання заважають мені це робити.
Паоло

Відповіді:


81

З посібника :

-O ctl_cmd
Керуйте головним процесом мультиплексування активного з'єднання. Коли -Oпараметр вказаний, ctl_cmdаргумент інтерпретується та передається в основний процес. Допустимими командами є: check (перевірте, чи працює головний процес), forward(запит переадресації без виконання команд), cancel(скасування переадресації), exit(прохання ведучого вийти) та stop (прохання ведучого перестати приймати подальші запити мультиплексування).

Більш старі версії тільки checkі exit, але цього достатньо для вашої мети.

ssh -O check host.example.com

Якщо ви хочете видалити всі з'єднання (не тільки з'єднання з певним хостом) одним махом, тоді fuser /tmp/ssh_mux_*або lsof /tmp/ssh_mux_*перелічіть ssh-клієнтів, які контролюють кожен сокет. Використовуйте fuser -HUP -k tmp/ssh_mux_*для чистого вбивства (використання найкращого сигналу SIGHUP, оскільки воно дозволяє клієнтам належним чином вийняти розетку).


Це відмінна відповідь. Це ідеально підходить для того, що я намагався досягти. checkнавіть корисніше, ніж те, що я шукав, а це exitвсе одно! : D
ELLIOTTCABLE

5
В OS X fuserне можна надсилати сигнали, але це працює так само добре:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

Я написав утиліту з відкритим кодом cmc, для управління сеансами 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

Ви можете запустити fuser /tmp/ssh_mux_blablabla(можливо, потрібно sudo) і вбити PID, який він повертає. fuserпоказує, які процеси використовують файл. (І більше, перевірити man fuser.)

Оновлення: перевірити відповідь Жиля; вона набагато детальніше.


3

Це працює для мене, використовуючи лише файл сокета для керуючого управління:

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

Приклад

Ось приклад, коли я вже встановив з'єднання з віддаленим сервером:

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

І з цим відключено:

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

Якби все-таки було підключено, це змусить його негайно вийти:

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

Мені це незрозуміло, але, мабуть, це може бути помилка в ssh тому, що він потребує додаткового аргументу в кінці, хоча blahце безглуздо в контексті комутаторів, які я використовую.

Без цього мені це дає:

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

Інформація про версію

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

Я підтвердив, що в обох цих версіях була необхідність додаткового хибного аргументу.

Список літератури

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.