Как к близкому (уничтожение) соединения ssh ControlMaster вручную

Существует a vi доступный в каждой системе Unix (или почти), однако Вы не можете сказать это ни о каком другом редакторе. Это - причина № 1, imo, чтобы изучить и ознакомиться с vi (отметьте 'vi' не 'энергия'). Я никогда не видел, что Emacs доступен в установке по умолчанию.

Я не говорю, не используют Emacs, или это - единственная причина использовать Vim, но когда Вы хотите смочь использовать системы Unix, которые не являются Вашими... vi часть универсального языка.

63
05.11.2011, 09:52
4 ответа

Из руководства:

-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, поскольку сигнал является лучшим, поскольку он позволяет клиентам правильно удалить свой сокет).

81
27.01.2020, 19:32
  • 1
    Это - превосходный ответ. Это идеально подходит для того, чего я пытался достигнуть. check еще более полезно, чем, что я искал, который является что exit делает так или иначе! спасибо :D –  ELLIOTTCABLE 06.12.2011, 16:19
  • 2
    В OS X fuser не может отправить сигналы, но это работает точно также: lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP –  Ori 15.01.2012, 23:06

Можно работать fuser /tmp/ssh_mux_blablabla (возможная необходимость sudo) и уничтожьте PID, который это возвращает. fuser шоу, какие процессы используют файл. (И больше, проверить man fuser.)

Обновление: проверьте ответ Gilles; это намного более подробно.

3
27.01.2020, 19:32

Я записал утилиту с открытым исходным кодом, 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
11
27.01.2020, 19:32

Это работает для меня, используя только файл сокета для мастера управления:

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

Информация о версии

ОС X
$ 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

Я подтвердил, что в обеих этих версиях требовался дополнительный фиктивный аргумент.

Ссылки

4
27.01.2020, 19:32

Теги

Похожие вопросы