SSH सत्र में Ctrl-C हैंडलिंग


20

जब मैं एक एसएसएच सत्र शुरू करता हूं जो लंबे समय से चलने वाली कमांड को निष्पादित करता है, तो Ctrl+ C(SIGINT) हैंडलिंग के साथ क्या होता है ?

मैं देख सकता हूं कि SSH सत्र बंद है, लेकिन मुझे यकीन नहीं है कि सबसे पहले SIGINT कौन मिलता है: क्या यह है ...

  1. दूरस्थ लंबे समय से चल रही कमान? वह है, (ए) रिमोट कमांड में सिग्नल हैंडलर को कहा जाता है और रिमोट कमांड को रोक देता है, (बी) शेल जो इसे स्पैन करता है वह यह पता लगाता है कि कमांड बंद हो गया है, और साथ ही बंद हो जाता है (सी) रिमोट sshd शेल को रोक देता है, इसलिए यह कनेक्शन बंद कर देता है

    या

  2. स्थानीय ssh संकेत प्राप्त करता है, और कनेक्शन बंद कर देता है।

मुझे लगता है कि (1) हो रहा है, लेकिन यह सुनिश्चित करना चाहते हैं।

मैं इस मामले में SIGINTs के शेल हैंडलिंग के साथ क्या होता है, इसके बारे में भी अनिश्चित हूं। उदाहरण के लिए, यदि मैं ...

ssh remote 'while true ; do sleep 1 ; date ; done'

और Ctrl+ C, फिर रिमोट कनेक्शन गिरा दिया जाता है। क्या एक शेल के तहत रिमोट कमांड चलाने का एक तरीका है जो Ctrl+ के बाद भी जीवित रहेगा C? यही है, इस मामले में, लूप को रोकें और मुझे दूरस्थ शेल पर काम करने की अनुमति दें?


3
Ctrl-C लिखकर उत्पन्न SIGINT द्वारा एक गैर-सक्रिय ssh ( ssh remote command, जैसा कि विरोध किया गया है ssh remote) को मार दिया जाएगा। दूरस्थ पक्ष शायद (ओएस पर निर्भर करता है) तब तक चलता रहता है जब तक वह बंद सॉकेट को पढ़ने या लिखने की कोशिश नहीं करता। यदि आप चाहते हैं कि आपके सभी कीस्ट्रोक्स, जिनमें ctrl-C भी शामिल है, को रिमोट पर उपयोग किया जाए ssh remote
मार्क प्लॉटनिक

@MarkPlotnick: ठीक है मार्क - अगर आप जवाब के रूप में अपनी प्रतिक्रिया नीचे जोड़ते हैं, तो मैं इसे स्वीकार करूंगा ... अपने स्वयं के परीक्षणों में, मैंने सत्यापित किया कि रिमोट को कोई संकेत नहीं मिलता है।
ttsiodras

जवाबों:


23

sshकुछ अलग-अलग तरीकों से लागू किया जा सकता है, प्रत्येक जिसके परिणामस्वरूप टर्मिनल-शुरुआत वाले संकेतों का थोड़ा अलग उपचार होता है Ctrl-C

  • ssh remotehostपर एक संवादात्मक सत्र चलाएगा remotehost। क्लाइंट की तरफ, sshस्टडी द्वारा उपयोग किए जाने वाले ट्टी को "रॉ" मोड में सेट करने का प्रयास करेंगे, और sshdरिमोट होस्ट पर एक छद्म ट्टी आवंटित करेगा और अपने शेल को लॉगिन शेल (जैसे -bash) के रूप में चलाएगा ।

    कच्चे मोड को सेट करने का मतलब है कि ऐसे अक्षर जो आम तौर पर सिग्नल भेजते हैं (जैसे कि Ctrl-Cऔर Ctrl-\) इसके बजाय सिर्फ इनपुट स्ट्रीम में डाले जाते हैं। sshइस तरह के पात्रों को दूरस्थ मेजबान को भेजेगा, जहां वे संभवतः SIGINT या SIGQUIT को भेजेंगे और, आम तौर पर, किसी भी कमांड को मारेंगे और आपको दूरस्थ मेजबान पर एक शेल में लौटाएंगे। Ssh कनेक्शन तब तक जीवित रहेगा, जब तक दूरस्थ शेल जीवित है।

  • ssh -t remotehost command args ...remotehostदूरस्थ पक्ष को छोड़कर, ऊपर की तरह, एक संवादात्मक सत्र your_shell -c "command args ..."चलाएगा। जैसा कि ऊपर, यदि आप टाइप करते हैं Ctrl-C, तो इसे दूरस्थ होस्ट को भेजा जाएगा, जहां कमांड को संभवतः SIGINT प्राप्त होगा और तुरंत बाहर निकल जाएगा, और फिर दूरस्थ शेल बाहर निकल जाएगा। रिमोट sshdतब कनेक्शन बंद कर देता है, और sshरिपोर्ट करता हैConnection to remotehost closed.

  • ssh remotehost command args ...पर एक गैर-संवादात्मक सत्र चलाएगा remotehost। क्लाइंट की तरफ, ट्टी को कच्चे मोड में सेट नहींssh करेगा (ठीक है, पासवर्ड या पासफ़्रेज़ में पढ़ने के लिए छोड़कर)। यदि आप टाइप करते हैं , तो SIGINT को भेजा जाएगा और बिना संदेश जारी किए भी तुरंत समाप्त कर दिया जाएगा ।Ctrl-CsshConnection to remotehost closed

    your_shell -c "command args ..."प्रक्रियाओं जाएगा संभावना दूरस्थ होस्ट पर चलता रहना । या तो वे अपने आप बाहर निकल जाएंगे, या एक प्रक्रिया अब बंद किए गए ssh सॉकेट में डेटा लिखने की कोशिश करेगी, जो इसे भेजने के लिए (आमतौर पर) घातक SIGPIP सिग्नल का कारण होगा।


1
तकनीकी रूप से, रिमोट कमांड सीधे सॉकेट पर नहीं लिखता है। इसका स्टडआउट एक पाइप है। और दूसरे छोर पर sshd डेटा को पढ़ता है, इसे एन्क्रिप्ट करता है, और सॉकेट के ऊपर भेजता है। अंतिम परिणाम हालांकि वही है। कमांड को सिगिपाइप मिलेगा क्योंकि क्लाइंट के डिस्कनेक्ट होने पर वह पाइप चला जाता है।
स्टीफन चेज़लस

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