शेल स्क्रिप्ट से पृष्ठभूमि प्रक्रियाओं के रूप में सुरंगों का प्रबंधन कैसे करें?


19

मुझे शेल स्क्रिप्ट से कुछ ssh-tunnels सेट करने की आवश्यकता है। मैंने उन्हें bg कार्यों के रूप में चलाने की कोशिश की है:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

लेकिन जब मैं उन्हें इस तरह लॉन्च करता हूं तो सुरंगें सही ढंग से काम नहीं करती हैं।

वे ठीक काम करते हैं जब मैं उन्हें अपने टैब में मैन्युअल रूप से सेट करता हूं, इसलिए मेरा अगला विचार टर्मिनल में स्क्रिप्ट को नए टैब खोलने और अग्रभूमि प्रक्रियाओं के रूप में कमांड चलाने का है।

नोट: यह प्रश्न मूल रूप से था "मैं शेल से एक नया टर्मिनल टैब कैसे लॉन्च करूं और फिर इसमें एक कमांड चलाऊं?", लेकिन मुझे सुरंगों से निपटने के बारे में दो उत्तर मिले। "खोल खोल" प्रश्न के लिए, मैंने इसे सुपरयूज़र पर पाया , जो काम करेगा, हालांकि पृष्ठभूमि में नए टैब अग्रभूमि की खिड़कियों के लिए बेहतर होंगे जो इसे खोलता है।


क्या आप सर्वर के लिए एक सक्रिय SSH सत्र रखते हैं? मतलब, क्या आपके पास पृष्ठभूमि में अपनी सुरंगें हैं, और एक अग्रभूमि SSH सत्र है जो आप वास्तव में काम करते हैं?
जैक एम।

अब तक, मैंने तीन टैब खुले रखे हैं: प्रत्येक सुरंग के लिए एक, और जो भी हो उसके लिए एक और एक। मेरा अधिकांश वास्तविक कार्य ग्रहण और एक ब्राउज़र में होता है।
sprugman

(सुरंगें केवल इतनी हैं कि मैं अपने स्थानीय टॉमकैट उदाहरण से कुछ दूरस्थ dbs तक पहुंच सकता हूं।)
अंकुरण

जवाबों:


26

यह तकनीकी रूप से पूछे गए प्रश्न का उत्तर नहीं है, बल्कि आपकी समस्या का उत्तर है। Ssh कमांड में दो स्विच हैं जो आपके लिए उपयोगी हो सकते हैं:

ssh -f -N -L 3000:server1:5029 me@server2

एसएचएस को फोरग्राउंड में बस किसी भी आवश्यक पासवर्ड के लिए पूछने के लिए चारों ओर घूमने के लिए कहता है, और फिर पृष्ठभूमि में खुद को डाल दिया, किसी दूरस्थ कमांड को निष्पादित नहीं कर रहा है, लेकिन सिर्फ सुरंग को संभाल रहा है।

यदि आप वास्तव में चाहते हैं कि यह एक टैब में दिखाई दे तो आप एक अलग समाधान चाहते हैं।


मैंने चाबियाँ सेट की हैं, इसलिए मुझे पासवर्ड दर्ज करने की आवश्यकता नहीं है, लेकिन यह काम करने लगता है। धन्यवाद! एक प्रश्न: मैं यह देखने के लिए सुरंगों का उपयोग कैसे करूं कि क्या उन्होंने समय समाप्त किया है, या उन्हें समाप्त करने के लिए, आदि? न तो jobsहै और न ही psसूचियों उन्हें एक हैंडल ....
sprugman

2
ps -wwajx | grep ssh को आपको प्रक्रियाएँ दिखानी चाहिए, फिर आप उन्हें फिट देखते हुए मार सकते हैं।
zzz

2
मैं यह जोड़ना चाहूंगा कि यदि आप -fप्रक्रिया को &समाप्त करते हैं और अंत में पृष्ठभूमि बनाते हैं, तो आप $!अपनी स्क्रिप्ट में बाद में सुरंग प्रक्रिया को मारने के लिए एक हैंडल के रूप में पीआईडी ​​प्राप्त कर सकते हैं ।
bk138

6

मेरा सुझाव है कि बस अपने सुरंगों को अपने "एक में जो भी" कनेक्शन के लिए एकीकृत किया जाए। आप अपनी ~/.ssh/configफ़ाइल में उपयुक्त प्रविष्टियाँ जोड़कर इसे आसान बना सकते हैं :

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

फिर आप बस रन करके लॉग इन कर सकते हैं:

> ssh server2

सुरंगों को ऊपर आना चाहिए और काम करना शुरू करना चाहिए, जिससे आप एक एकल एसएसएच उदाहरण के साथ छोड़ देंगे जिसमें "जो भी" करना है। यदि आपको दूसरा कनेक्शन खोलने की आवश्यकता है server2, तो आपको एक त्रुटि मिल सकती है, हालांकि:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

यह आपकी आंखों के अलावा किसी और चीज को नुकसान नहीं पहुंचाता है। आप अन्य सर्वरों के लिए समान पंक्तियों को जोड़कर एकाधिक फ़ॉर्वर्ड के लिए इन्हें आगे भी सेट कर सकते हैं, और यह सब स्वचालित रूप से होगा।


@ ज़ज़ का जवाब एक ही काम करता है, कम या ज्यादा, और थोड़ा और सीधा है। हालांकि धन्यवाद।
अंकुरण

यह, -f -N विकल्पों के साथ संयुक्त एक शॉट में कई बंदरगाहों के लिए अग्रेषण स्थापित करने का एक शानदार तरीका है। धन्यवाद दोस्त।
narsk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.