मैन्युअल रूप से 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_*उन सभी को सफाई से मारने के लिए उपयोग करें (सिग्नल के रूप में SightUP का उपयोग करना सबसे अच्छा है क्योंकि यह क्लाइंट को उनके सॉकेट को ठीक से हटाने देता है)।


यह एक उत्कृष्ट उत्तर है। मैं जो हासिल करने की कोशिश कर रहा था, उसके लिए यह एकदम सही हैcheckइससे भी अधिक उपयोगी है कि मैं क्या देख रहा था, जो कि exitवैसे भी क्या है! : D
ELLIOTTCABLE

5
OS X में fuserसिग्नल नहीं भेजे जा सकते, लेकिन यह ठीक वैसे ही काम करता है:lsof -Fp /tmp/ssh_mux_* | cut -c 2- | xargs kill -HUP
Ori

11

मैंने नियंत्रण स्रोत 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) को चला सकते हैं और पीआईडी ​​को मार सकते हैं जो इसे लौटाता है। 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
सेंटोस 7.x
$ ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

मैंने पुष्टि की कि इन दोनों संस्करणों पर, अतिरिक्त फर्जी तर्क की आवश्यकता थी।

संदर्भ

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.