स्थायी सुरंग बनाने के लिए स्थायी पृष्ठभूमि ssh कनेक्शन: सही तरीका क्या है?


41

संबंधित प्रश्न: सर्वर से क्लाइंट तक ssh कनेक्शन आरंभ करें

वहां से जवाब देने से मुझे बहुत मदद मिली, इस कमांड को मेरी ज़रूरत है:

ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP

इसलिए मैंने हर समय फिर से जोड़ने के लिए स्क्रिप्ट लिखी:

 #!/bin/bash

 while true; do
    echo "try to connect..."
    ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
    echo "restarting in 5 seconds.."
    sleep 5
 done

और इसमें जोड़ दिया /etc/crontab। लेकिन मुझे पता चला कि अगर मैं इसे शेल से "हाथ से" निष्पादित करता हूं, तो यह काम करता है, लेकिन अगर इसे क्रोन कहा जाता है, तो एसएचएस कनेक्ट होता है और तुरंत खत्म होता है। (इसलिए, ऊपर दी गई स्क्रिप्ट हर समय मेल खाती है)

से man ssh, मैंने पाया कि पृष्ठभूमि कनेक्शन के लिए मुझे इसे -nकुंजी के साथ कॉल करना चाहिए , लेकिन इससे मदद नहीं मिली। फिर, मैंने बस इसी तरह की स्क्रिप्ट्स के लिए चारों ओर देखा और मैंने पाया कि अगर मैं कॉल करता हूं तो यह काम करता है tail -f something, अर्थात कुछ "अटैचमेंट" कमांड, इसलिए मैंने अभी खाली फाइल बनाई है /tmp/dummy_fileऔर अब मेरा ssh कमांड इस तरह दिखता है:

ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file

यह अब काम करता है! लेकिन, यह समाधान थोड़ा बदसूरत लगता है, साथ ही मैं वास्तव में उस व्यवहार के वास्तविक कारणों को नहीं समझता हूं। बस संयोग से, मैंने bashइसके बजाय कॉल करने की कोशिश की tail -f( bashमुझे लगता है "कमांडिंग" कमांड भी है), लेकिन यह काम नहीं करता है।

तो, क्या कोई भी इस व्यवहार की व्याख्या कर सकता है, और रिवर्स ssh सुरंग को बनाए रखने के लिए पृष्ठभूमि ssh कनेक्शन बनाने का सही तरीका क्या है?


&आपके ssh कमांड के अंत में उपयोग करने के बारे में क्या :ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
Networker

लेकिन फिर मेरा whileलूप बार-बार चलेगा, sshहर 5 सेकंड में नया बैकग्राउंड कनेक्शन शुरू होगा, है ना? यह वही नहीं है जो मुझे चाहिए।
दिमित्री फ्रैंक

जवाबों:


37

ऐसा लगता है कि आप -Nssh का विकल्प चाहते हैं ।

 -N      Do not execute a remote command.  This is useful for just forwarding ports
         (protocol version 2 only).

16

मैं दृढ़ता से आपको विचार करने का सुझाव दूंगा autossh। इसमें कुछ विशिष्ट आंकड़े हैं जो यह निर्धारित करने की अनुमति देंगे कि क्या कनेक्शन हानि अंतर्निहित कारण है और पुन: प्रयास प्रयासों की आवृत्ति कम कर देगा। इसके अलावा यह अतिरिक्त सुरंगों का उपयोग करके कनेक्शन की निगरानी करता है, जो कि आपके द्वारा पूछे जा रहे परिदृश्यों के लिए इसे अत्यधिक उपयोगी बनाता है।

यदि आप उबंटू पर हैं, उदाहरण के लिए, आप autossh upstartउबंटू को कॉन्फ़िगर करने के तरीके के बारे में कुछ उपयोगी उदाहरणों को खोजने के लिए एक वेब खोज कर सकते हैं ताकि सुरंग को लगातार फैशन में रखा जाए।

मैं कुछ सेवाओं के लिए हर समय अपने सर्वर के लिए एक टनल कनेक्शन खुला रखने के लिए इसका उपयोग कर रहा हूं।


मैंने वास्तव में कोशिश की थी autossh, मैंने इस लेख को पढ़ा है: goo.gl/jVuSS , लेकिन यह केवल मेरे लिए काम करता है अगर मेरे पास सिस्टम बूट पर इंटरनेट कनेक्शन है; लेकिन यदि कनेक्शन बाद में स्थापित किया गया है, तो यह काम नहीं किया। सुनिश्चित नहीं हैं कि, शायद मैंने कुछ गलत किया है, लेकिन फिर भी इस लेख के लेखक में है sleep 10उसकी में /etc/rc.local, क्रम में यकीन है कि इंटरनेट कनेक्शन पहले से ही तैयार है जब autossh कहा जाता है होना करने के लिए में।
दिमित्री फ्रैंक

2
@DmitryFrank: यदि आपने प्रयास किया है तो आपके प्रश्न में ऐसा उल्लेख नहीं किया जाना अनुचित है। मैं अब भी इसकी सलाह देता हूं। के साथ upstartऔर अन्य init प्रतिस्थापन आप सुरंग के शुरू होने से एक या अधिक नेटवर्क उपकरणों को जोड़ सकते हैं। वेब पर सबसे अच्छा समाधान (IMO) यह एक है: erik.torgesta.com/tag/ssh-upstart ... और किसी sleep 10भी तरह से कुछ किनारे के मामलों में मदद नहीं करेगा।
0xC0000022L

मुझे खेद है कि इसका उल्लेख नहीं करने के लिए, ईमानदार होने के लिए जब यह मेरे लिए काम नहीं करता था तो मैंने ऐसा करने का फैसला किया "बस हाथ से" और पूरी तरह से ऑटोस के बारे में भूल गया। के लिए धन्यवाद ssh-upstart, मैं इसे देख लूंगा!
दिमित्री फ्रैंक

पार्टी के लिए देर से लेकिन मैं जोड़ना चाहता था मैं एक रिवर्स सुरंग बनाए रखने के लिए मज़बूती से ऑटोशो नहीं कर सकता था। अगर किसी कारण से रिवर्स टनल विफल हो जाती है, तो ऑटोपेश नोटिस नहीं करेगा और कनेक्शन को फिर से नहीं बनाएगा। मुझे कई सर्वरों से कई सुरंगों की आवश्यकता है और यह मामलों को जटिल करता है
DeveloperChris

@DeveloperChris: ठीक है, मैं वास्तव में इस परिदृश्य को चला रहा हूं - और मज़बूती से। जब तक रिमोट सर्वर शाब्दिक रूप से नीचे नहीं जाता है और आपको इसे वापस स्विच करने की आवश्यकता होती है, तब तक सुरंग हमेशा पुनर्निर्मित हो जाती है। शायद आपको अपना प्रश्न लिखना चाहिए और विवरण प्रदान करना चाहिए। निश्चित रूप से यह किया जा सकता है। मैंने इसका उपयोग महीनों तक वीपीएन समस्याओं के आसपास काम करने के लिए किया है।
0xC0000022L

9

मैं @ 0xC0000022L का दूसरा सुझाव और उपयोग करूँगा autossh। मैं इसे अपने लैपटॉप से ​​SSH कनेक्शन बनाए रखने के लिए उपयोग करता हूं क्योंकि मैं इसे एक जगह से दूसरी जगह ले जाता हूं और यह काम करता है। मैं अपने व्यक्तिगत SMTP और IMAP सर्वर तक पहुंच के लिए इस कनेक्शन का उपयोग 25 और 2143 सुरंगों को वापस करने के लिए करता हूं।

यहां वह स्क्रिप्ट है जिसका मैं उपयोग करता हूं:

$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash

autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o

मैं तब होस्ट के लिए Hostअपनी $HOME/.ssh/configफ़ाइल में प्रविष्टि रखता हूं imap-o

$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes

GatewayPorts yes

Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa

Host imap-o
    User sam
    ProxyCommand ssh sam@mygw.mydom.com nc `echo %h|sed 's/-o//'` %p

autossh_mail.shस्क्रिप्ट मेरे डेस्कटॉप जब मैं लॉगिन के हिस्से के रूप में चलाया जाता है। आप द्वारा ही पहुंच सकते gnome-session-properties

       ss # १

                                          ss # 2

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