Существует a vi
доступный в каждой системе Unix (или почти), однако Вы не можете сказать это ни о каком другом редакторе. Это - причина № 1, imo, чтобы изучить и ознакомиться с vi
(отметьте 'vi' не 'энергия'). Я никогда не видел, что Emacs доступен в установке по умолчанию.
Я не говорю, не используют Emacs, или это - единственная причина использовать Vim, но когда Вы хотите смочь использовать системы Unix, которые не являются Вашими... vi
часть универсального языка.
Из руководства:
-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, поскольку сигнал является лучшим, поскольку он позволяет клиентам правильно удалить свой сокет).
Можно работать fuser /tmp/ssh_mux_blablabla
(возможная необходимость sudo
) и уничтожьте PID, который это возвращает. fuser
шоу, какие процессы используют файл. (И больше, проверить man fuser
.)
Обновление: проверьте ответ Gilles; это намного более подробно.
Я записал утилиту с открытым исходным кодом, 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
Это работает для меня, используя только файл сокета для мастера управления:
$ 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]
$ 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
Я подтвердил, что в обеих этих версиях требовался дополнительный фиктивный аргумент.
check
еще более полезно, чем, что я искал, который является чтоexit
делает так или иначе! спасибо :D – ELLIOTTCABLE 06.12.2011, 16:19fuser
не может отправить сигналы, но это работает точно также:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
– Ori 15.01.2012, 23:06