SSH सत्र को कैसे मारना है जिसे -f विकल्प के साथ शुरू किया गया था (पृष्ठभूमि में चलाएं)


49

मैं इस पर बहुत खोया हुआ हूं। मैन पेज से:

 -f      Requests ssh to go to background just before command execution.

-fविकल्प के साथ एसएसएच शुरू करने के बाद , मेरे पास एक काम करने वाली सुरंग है। लेकिन जब मैं इसका उपयोग करना समाप्त कर लेता हूं, तो मुझे नहीं पता कि इसके साथ आगे बातचीत कैसे की जाती है। उदाहरण के लिए, मैं SSH सुरंग को बंद नहीं कर सकता , जब मैं इसके साथ समाप्त होता हूं।

मुझे पता है कि सामान्य तरीके काम नहीं करते हैं। उदाहरण के लिए, jobsकुछ भी नहीं लौटाता है। ~आदेश मान्यता प्राप्त नहीं है (और मैं इसे वास्तव में कैसे उपयोग करने के लिए, वैसे भी पता नहीं है)।

हालांकि, pgrepमुझे बताता है कि एसएसएच सुरंग अभी भी चल रही है (मैंने टर्मिनल बंद कर दिया है, आदि)। मैं इसके साथ कैसे बातचीत करूं? मैं इसे कैसे बंद करूं?

जवाबों:


64

स्क्रिप्टिंग के लिए विशेष रूप से अच्छा समाधान master modeनियंत्रण कमांड के लिए सॉकेट के साथ उपयोग करना है:

ssh -f -N -M -S <path-to-socket> -L <port>:<host>:<port> <server>

इसे फिर से बंद करने के लिए:

ssh -S <path-to-socket> -O exit <server>

यह प्रक्रिया आईडी और किसी भी समय के मुद्दों के लिए दोनों पकड़ से बचा जाता है जो अन्य तरीकों से जुड़ा हो सकता है।


10
बस uninitiated के लिए थोड़ा विस्तार करने के लिए, <path-to-socket> एक फ़ाइल है जो ssh क्लाइंट का मास्टर उदाहरण अन्य ssh क्लाइंट इंस्टेंस के साथ अंतर-प्रक्रिया संचार के लिए बनाएगा जो मास्टर इंस्टेंस कनेक्शन साझा करना चाहते हैं। बनाई गई फ़ाइल वास्तव में एक यूनिक्स डोमेन सॉकेट का प्रतिनिधित्व करेगी। इसे आप जहां चाहें और जहां चाहें नाम दिया जा सकता है, उदाहरण के लिए /tmp/session1(हालांकि इसे % पैटर्न का उपयोग करके नाम देने की सिफारिश की गई है - कंट्रोलपाथ विवरण देखें man ssh_config)
गोलेम

1
इसके अलावा ऐसा लगता है कि कमांड का <सर्वर> भाग ssh -S <path-to-socket> -O exit <server>कोई भी स्ट्रिंग हो सकता है, लेकिन यह मौजूद होना चाहिए। वह अनाड़ी है।
गोलेम

1
यह उत्तर और प्रश्न कुछ पुराना है, लेकिन मैं इसे इस समस्या से निपटने का सबसे सुंदर और 'सही' तरीका बताना चाहता था। धन्यवाद महोदय!
zentechinc

41

मुझे यहाँ समाधान मिला: http://www.g-loaded.eu/2006/11/24/auto-closing-ssh-tunnels/

सबसे अच्छा तरीका है - सुरंग जो ऑटो-पास

जैसा कि पहले उल्लेख किया गया है, -f -N स्विच संयोजन का उपयोग करने के बजाय, हम -f अकेले उपयोग कर सकते हैं, लेकिन रिमोट मशीन पर एक कमांड निष्पादित भी कर सकते हैं। लेकिन, किस कमांड को निष्पादित किया जाना चाहिए, क्योंकि हमें केवल एक सुरंग को शुरू करने की आवश्यकता है?

यह तब है जब नींद सभी का सबसे उपयोगी आदेश हो सकता है! इस विशेष स्थिति में, नींद के दो फायदे हैं:

  • यह कुछ भी नहीं करता है, इसलिए कोई संसाधनों का उपभोग नहीं किया जाता है
  • उपयोगकर्ता यह निर्दिष्ट कर सकता है कि इसे कितनी देर तक निष्पादित किया जाएगा

Ssh टनल को ऑटो-क्लोज करने में ये कैसे मदद करते हैं, नीचे बताया गया है।

हम दूरस्थ मशीन पर 10 सेकंड के लिए नींद कमांड निष्पादित करते हुए, पृष्ठभूमि में ssh सत्र शुरू करते हैं। सेकंड की संख्या महत्वपूर्ण नहीं है। उसी समय, हम vncviewer को पहले की तरह निष्पादित करते हैं:

[me@local]$ ssh -f -L 25901:127.0.0.1:5901 me@remote.example.org sleep 10; \
          vncviewer 127.0.0.1:25901:1

इस स्थिति में, ssh क्लाइंट को बैकग्राउंड (-f) में ssh सत्र को कांटा करने के लिए निर्देश दिया जाता है, सुरंग बनाएं (-L 25901: 127.0.0.1: 5901) और दूरस्थ सर्वर पर 10 सेकंड के लिए स्लीप कमांड निष्पादित करें (नींद) 10)।

मूल रूप से इस विधि और पिछले एक (-N स्विच) के बीच का अंतर यह है कि इस मामले में ssh क्लाइंट का प्राथमिक लक्ष्य सुरंग बनाना नहीं है, बल्कि 10 सेकंड के लिए स्लीप कमांड को निष्पादित करना है। सुरंग का निर्माण कुछ प्रकार का दुष्प्रभाव है, एक माध्यमिक लक्ष्य है। यदि vncviewer का उपयोग नहीं किया गया था, तो ssh क्लाइंट 10 सेकंड की अवधि के बाद बाहर निकल जाएगा, क्योंकि उसके पास एक ही समय में सुरंग को नष्ट करने के लिए और अधिक नौकरियां नहीं होंगी।

स्लीप कमांड के निष्पादन के दौरान, यदि कोई अन्य प्रक्रिया, इस मामले में vncviewer, उस सुरंग का उपयोग करना शुरू कर देती है और इसे 10 सेकंड की अवधि से आगे रखती है, तो, भले ही ssh क्लाइंट अपनी दूरस्थ नौकरी (नींद का निष्पादन) समाप्त कर ले, यह नहीं हो सकता है। बाहर निकलना क्योंकि सुरंग में एक और प्रक्रिया होती है। दूसरे शब्दों में, ssh क्लाइंट सुरंग को नष्ट नहीं कर सकता क्योंकि उसे vncviewer को भी मारना होगा। जब vncviewer सुरंग का उपयोग करना बंद कर देता है, तो ssh क्लाइंट भी बाहर निकल जाता है, क्योंकि यह पहले ही अपना लक्ष्य पूरा कर चुका होता है।

इस तरह, पृष्ठभूमि में कोई भी ssh प्रक्रिया नहीं चलती है।


4
एक छोटी टिप्पणी / सुधार: जहां तक ​​मुझे पता है कि आपको निर्दिष्ट करना है vncviewer 127.0.0.1::25091क्योंकि आप पोर्ट सिंटैक्स का उपयोग कर रहे हैं न कि डिस्प्ले सिंटैक्स का।
क्रिश्चियन वुल्फ

यह एक महान विचार है, और बड़े करीने से एक मुद्दा है जो मैंने विंडोज पर रखा था। Ssh क्लाइंट के साथ Windows शिप के हाल के संस्करण, और यह सिद्धांत रूप में -S विकल्प का समर्थन करता है, लेकिन अभी मेरे लिए काम नहीं कर रहा था।
13

9

सुरंग, उपयोग को मारने के लिए ps -C sshया ps | grep sshया किसी अन्य संस्करण निर्धारित करने के लिए ssh प्रक्रिया अपने सुरंग चल रहा है। फिर इसे मार डालो।

वैकल्पिक रूप से, आप यह निर्धारित करके प्रक्रिया की तलाश कर सकते हैं कि किसका यह पोर्ट खुला है:

netstat -lnpt | awk '$4 ~ /:1234$/ {sub(/\/.*/, "", $7); print $7}'

यदि आप अपने मशीन (अपने उपयोगकर्ता के रूप में) पर चल रहे सभी ssh क्लाइंट्स को मारना चाहते हैं, pkill sshतो यह करेंगे।


6

जैसा कि यहां दूसरों द्वारा उत्तर दिया गया है, pkill sshइसे मारता है।

एक सुरंग बनाने के लिए जिसे वापस लाया जा सकता था, मैं इसे विकल्प के screenबिना शुरू करता हूं -f, और फिर स्क्रीन को अलग कर देता हूं Ctrl-A D। सुरंग को वापस लाने के लिए, कॉल करें screen -r



1
यदि आप दूरस्थ रूप से कनेक्ट कर रहे हैं तो सावधान रहें। pkill ssh आपके वर्तमान कनेक्शन को भी मार देगा।
kennut

@kennyut अभी तक एक और कारण का उपयोग करने के लिए screen
हॉटियन यांग

0

जब मैं एक सुरंग शुरू करता हूँ:

ssh -fN -D 8080 SOME_IP_HERE -l LOGIN_NAME_HERE
  • -f कमांड निष्पादन से ठीक पहले पृष्ठभूमि पर जाने के लिए ssh अनुरोध करता है।
  • -Nरिमोट कमांड निष्पादित न करें। यह सिर्फ अग्रेषित बंदरगाहों के लिए उपयोगी है।
  • -D एक स्थानीय "गतिशील" अनुप्रयोग-स्तरीय पोर्ट अग्रेषण को निर्दिष्ट करता है।
  • -l उपयोगकर्ता को दूरस्थ मशीन पर लॉग इन करने के लिए निर्दिष्ट करता है।

मैं इसे बंद कर सकता हूं:

ps -lef | grep ssh | grep "8080" | awk "{print \$2}" | xargs kill

-1

एक कमांड लाइन में सभी सुरंगों को मारने के लिए मुझे सबसे अच्छा समाधान मिला है

ps -lef|grep ssh|grep "\-L"|awk '{print $4}'|xargs kill

ssh सत्र के लिए, बस सुरंग विकल्प निकालें

ps -lef|grep ssh|awk '{print $4}'|xargs kill

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