Как закрыть (убить) соединения 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.