संबंधित प्रश्न: सर्वर से क्लाइंट तक 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 कनेक्शन बनाने का सही तरीका क्या है?
while
लूप बार-बार चलेगा, ssh
हर 5 सेकंड में नया बैकग्राउंड कनेक्शन शुरू होगा, है ना? यह वही नहीं है जो मुझे चाहिए।
&
आपके ssh कमांड के अंत में उपयोग करने के बारे में क्या :ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &