अस्थायी SSH सुरंग स्थापित करने के लिए स्क्रिप्ट को बैश करें


132

साइगविन पर, मुझे एक बैश स्क्रिप्ट चाहिए:

  1. एक दूरस्थ सर्वर के लिए एक SSH सुरंग बनाएँ।
  2. कुछ काम स्थानीय रूप से करें जो सुरंग का उपयोग करता है।
  3. फिर सुरंग बंद करें।

शटडाउन भाग ने मुझे हैरान कर दिया है।

वर्तमान में, मेरे पास एक लंगड़ा समाधान है। एक शेल में मैं सुरंग बनाने के लिए निम्नलिखित चलाता हूं:

# Create the tunnel - this works! It runs forever, until the shell is quit.
ssh -nNT -L 50000:localhost:3306 jm@sampledomain.com

फिर, एक और शेल विंडो में, मैं अपना काम करता हूं:

# Do some MySQL stuff over local port 50000 (which goes to remote port 3306)

अंत में, जब मैं किया जाता है, तो मैं सुरंग को मारने के लिए पहली शेल विंडो बंद कर देता हूं।

मैं यह सब एक स्क्रिप्ट में करना चाहता हूँ जैसे:

# Create tunnel
# Do work
# Kill tunnel

मैं सुरंग प्रक्रिया का ट्रैक कैसे रखूं, इसलिए मुझे पता है कि किसको मारना है?


मैंने एक स्क्रिप्ट लिखी जो ssh की सुरंग बनाने में मदद करेगी, आप इसे यहाँ देख सकते हैं: github.com/gdbtek/ssh-tunneling.git
Nam Nguyen

जवाबों:


324

आप इसे साफ तौर पर ssh 'कंट्रोल सॉकेट' के साथ कर सकते हैं। पहले से चल रही SSH प्रक्रिया के बारे में बात करने और इसे पीड करने के लिए, इसे मारें आदि। निम्नानुसार 'कंट्रोल सॉकेट' (-मास्टर के लिए मास्टर और सॉकेट के लिए) का उपयोग करें:

$ ssh -M -S my-ctrl-socket -fnNT -L 50000:localhost:3306 jm@sampledomain.com
$ ssh -S my-ctrl-socket -O check jm@sampledomain.com
Master running (pid=3517) 
$ ssh -S my-ctrl-socket -O exit jm@sampledomain.com
Exit request sent. 

ध्यान दें कि my-ctrl-socket एक वास्तविक फ़ाइल होगी जो बनाई गई है।

मुझे यह जानकारी ओपनएसएसएच मेलिंग सूची पर बहुत आरटीएफएम उत्तर से मिली ।


6
यह इस विषय पर अब तक का सबसे अच्छा जवाब है। बहुत-बहुत धन्यवाद, यह स्वीकार किया जाना चाहिए। मैं इसका उपयोग अपने Vagrant VM से कनेक्ट करने और फ्लाईवेबडी अपडेट स्क्रिप्ट चलाने के लिए करता हूं।
ईसाई

2
जाहिरा तौर पर नियंत्रण सॉकेट हर जगह काम नहीं करते हैं। उदाहरण के लिए, मैं Operation not permittedड्रोन पर मिलता हूं। निरंतर एकीकरण वातावरण:muxserver_listen: link mux listener ssh-ctrl-socket.wsASkszgSBlK7kqD => ssh-ctrl-socket: Operation not permitted
मिको ओकटामा

तो इसके my-ctrl-socketचलने के बाद फाइल का क्या होता है ? जब मैं ls -laवर्तमान फ़ोल्डर में करता हूं तो मैं फ़ाइल को नहीं देख सकता।
सचिन्रुक

2
यदि आप इसे एक स्क्रिप्ट में उपयोग करते हैं तो आपको उपलब्ध होने के लिए कुछ सेकंड के लिए कंट्रोल सॉकेट का इंतजार करना होगा। मेरा समाधान:while [ ! -e $ctrl_socket ]; do sleep 0.1; done
एडम वालनर

जब मैं यह कर रहा हूँ open failed: administratively prohibited: open failedऔर मुझे नहीं लगता कि यह सुरंग खोल रहा है
एंडी रे

21

आप SSH को -f ऑप्शन के साथ बैकग्राउंड में बता सकते हैं लेकिन आपको PID $ के साथ नहीं मिलेगा। साथ ही सुरंग का उपयोग करने से पहले अपनी स्क्रिप्ट को समय पर एक मनमानी मात्रा में सोते हुए, आप -o ExitOnForwardFailure -o का उपयोग कर सकते हैं = हां -f और SSH पृष्ठभूमि में खुद को रखने से पहले सभी दूरस्थ पोर्ट सफलतापूर्वक स्थापित होने की प्रतीक्षा करेंगे। PID प्राप्त करने के लिए आप ps का आउटपुट grep कर सकते हैं। उदाहरण के लिए आप उपयोग कर सकते हैं

...
ssh -Cfo ExitOnForwardFailure=yes -NL 9999:localhost:5900 $REMOTE_HOST
PID=$(pgrep -f 'NL 9999:')
[ "$PID" ] || exit 1
...

और सुनिश्चित करें कि आप वांछित पीआईडी ​​प्राप्त कर रहे हैं


आपको इसका एहसास नहीं हो सकता है, लेकिन यह एक तरह की प्रतिभा है। मैं SSH सुरंग PID को ट्रैक करने का एक तरीका खोज रहा था और सिस्टमड सर्विस स्क्रिप्ट का उपयोग करके लगभग समाप्त हो गया। अब और नहीं: मैं एसएसएच प्रक्रिया को प्राप्त कर सकता हूं जिसे मुझे सुरंग नाम का उपयोग करने की आवश्यकता है। इस विचार ने किसी तरह मुझे पूरी तरह से छोड़ दिया है। आपका बहुत बहुत धन्यवाद!
aexl

19
  • आप sshबैकग्राउंड में जाने के लिए कह सकते हैं &और दूसरी तरफ एक शेल नहीं बना सकते (सिर्फ सुरंग खोल सकते हैं) कमांड लाइन फ्लैग के साथ (मुझे लगता है कि आपने पहले ही ऐसा कर लिया था -N)।
  • PID के साथ सहेजें PID=$!
  • अपना सामान करो
  • kill $PID

संपादित करें: फिक्स्ड $? $ को! और जोड़ा


3
यदि मेरी स्क्रिप्ट KILL से पहले कहीं मर जाती है, तो मुझे उसे संभालने के लिए सावधान रहना होगा।
जेएम।

2
@jm: trap 'kill $PID' 1 2 15स्क्रिप्ट की विफलता के कई मामलों को कवर करेगा।
नॉर्मन रैमसे

3
इसके लिए मज़बूती से काम करने के लिए, मुझे सुरंग बनाने के बाद थोड़ा सा "नींद" करना पड़ा, लेकिन उपयोग करने से पहले।
जेएम।

@NormanRamsey मुझे लगता है कि आप का मतलब है trap "kill $PID", क्योंकि बैश केवल दोहरे उद्धृत स्ट्रिंग्स के अंदर वैरिएबल को
विभाजित करेगा

1
@JuanCaicedo अंतर केवल तभी महत्वपूर्ण होगा जब PIDचर को बाद में फिर से परिभाषित किया गया हो। चर या तो विस्तारित होता है जब trapअंतर्निहित (ओपी का दृष्टिकोण) कहा जाता है या जब एक संकेत पकड़ा गया है (आपका दृष्टिकोण); दोनों दृष्टिकोण यहाँ एक ही परिणाम उत्पन्न करते हैं।
विटिको

4

मैं अलग-अलग कार्यों के लिए एक नया शेल लॉन्च करना पसंद करता हूं और मैं अक्सर निम्नलिखित कमांड संयोजन का उपयोग करता हूं:

  $ sudo bash; exit

या कभी-कभी:

  $ : > sensitive-temporary-data.txt; bash; rm -f sensitive-temporary-data.txt; exit

ये कमांड एक नेस्टेड शेल बनाते हैं जहां मैं अपना सारा काम कर सकता हूं; जब मैं समाप्त कर लेता हूं तो मैं CTRL-D से टकरा जाता हूं और पैरेंट शेल साफ हो जाता है और बाहर भी निकल जाता है। आप आसानी bash;से अपनी ssh सुरंग लिपि में killभाग से ठीक पहले फेंक सकते हैं ताकि जब आप नेस्टेड शेल से लॉग आउट करें तो आपकी सुरंग समाप्त हो जाए:

#!/bin/bash
ssh -nNT ... &
PID=$!
bash
kill $PID

बहुत ही रोचक। यह "ट्रैप" समस्या को बेहतर तरीके से संभाल सकता है। इसके लिए प्रयास करना होगा।
जे.एम.

2

आप लांच कर सकता है sshएक साथ &पृष्ठभूमि में डाल दिया और उसके आईडी हड़पने जब कर रही करने के लिए एक अंत,। तब आपको बस killउस आईडी का एक काम करना होगा जब आप कर लेंगे।


एम्परसेंड ("&") का उपयोग करते समय जागरूक रहें। यह एक बदसूरत दृष्टिकोण है क्योंकि आपको अपने लिए स्थापित वास्तविक कनेक्शन का निर्धारण करना होगा। यह आगे कोड को निष्पादित करने का कारण बन सकता है जो वास्तविक कनेक्शन के पूरी तरह से स्थापित होने की प्रतीक्षा नहीं कर रहा है। इसके अलावा यदि स्क्रिप्ट टूट जाती है तो कनेक्शन स्वचालित रूप से नहीं मारा जाएगा।
जोनाथन

2

एक अन्य संभावित विकल्प - यदि आप अपेक्षित पैकेज को स्थापित कर सकते हैं, तो आपको पूरी चीज़ को स्क्रिप्ट करने में सक्षम होना चाहिए। कुछ अच्छे उदाहरण यहाँ: http://en.wikipedia.org/wiki/Expect

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