जब पोर्ट अग्रेषण विफल हो जाता है तो क्या मैं SSH को विफल कर सकता हूं?


39

यदि मैं एक दूरस्थ बंदरगाह आगे करता हूं, एक ला -R 3690:localhost:3690जब एक बंधन पहले से ही दूरस्थ मेजबान पर बंदरगाह पर मौजूद है, तो मुझे यह चेतावनी मिलती है:

Warning: remote port forwarding failed for listen port 3690

वहाँ एक रास्ता है ssh विफल (यानी एक nonzero वापसी कोड के साथ बाहर निकलें), बजाय सिर्फ एक चेतावनी फेंकना?


क्या आपको वास्तव में एक टर्मिनल चैनल बनाने की जरूरत है, या सिर्फ अग्रेषण?
इग्नासियो वाज़केज़-अब्राम्स

1
@ इग्नासियोवेज़ज़-एब्राम्स: बस फॉरवर्डिंग।
मैट जॉइनर

जवाबों:


63

रन

ssh -o "ExitOnForwardFailure yes" ...

या डाल दिया

ExitOnForwardFailure yes

में ~/.ssh/configman ssh_configविवरण के लिए देखें।


दुर्भाग्य से मेरे पास ओपनएसएसएच 4 है। क्या आप मुझे बता सकते हैं कि यह सुविधा कब जोड़ी गई थी?
मैट जॉइनर

2
नहीं, मुझे नहीं पता। यह एक संस्करण 5 की सुविधा हो सकती है। लेकिन संस्करण 4 अब कई साल पुराना होना चाहिए, और हर समय सुरक्षा सुधार हैं । यदि आप स्वयं सर्वर को अपग्रेड नहीं कर सकते हैं, तो आप अपने सर्वर व्यवस्थापक से पूछ सकते हैं कि क्या वह उस संस्करण का उपयोग करना सुरक्षित समझता है।
एंड्रयू शुलमैन

ध्यान रखें कि यदि आप स्पष्ट रूप से निर्दिष्ट नहीं करते हैं bind_addressतो ssh अभी भी विफल नहीं हो सकता है। उदाहरण के लिए यदि कोई अन्य उपयोगकर्ता पहले से ही IPv6 लोकलहोस्ट पर सुन रहा है [::1]:3690तो ssh केवल ipv4 को बांध सकता है 127.0.0.1:3690और शिकायत नहीं करता है। लेकिन आपका svn क्लाइंट शायद ipv6 सॉकेट (हमलावर का) पसंद करेगा। सुरक्षित बेहतर उपयोग के लिए-R [::1]:3690:localhost:3690 -R 127.0.0.1:3690:localhost:3690
rudimeier

3
एक भी ssh -o ExitOnForwardFailure = व्हाट्सएप और उद्धरण की आवश्यकता से बचने के लिए उपयोग कर सकता है।
freespace

1

मैं लक्ष्य होस्ट पर बैश स्क्रिप्ट का उपयोग यह सुनिश्चित करने के लिए करता हूं कि अग्रेषण सही ढंग से खोला गया था। SSH कनेक्शन इसे चलाएगा और बाहर निकलेगा यदि पोर्ट अग्रेषण के साथ कोई समस्या है, जैसे

क्लाइंट साइड स्क्रिप्ट: (यह पोर्ट अग्रेषण सेटिंग्स के लिए .sh / config का उपयोग करता है)

#!/bin/bash    

while true; do
    echo -n starting at : "
    date
    ssh user@server bin/sshloop.sh
    echo "got back, sleeping 17 "
    sleep 17
done 

सर्वर साइड स्क्रिप्ट (बिन / sshloop.sh)

#!/bin/bash

while true; do 
  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client"
  sleep 17
  if ! netstat -an | grep -q ":::1090 " ; then
     echo "1090 forward missing, bailing out"
     exit
  fi
done

शायद -dms के साथ स्क्रीन के नीचे क्लाइंट साइड स्क्रिप्ट भी चलाते हैं


2
मैं जिस मामले से बचने की कोशिश कर रहा हूं वह यह है कि पहले से मौजूद एक पोर्ट मौजूद है, और एक चेतावनी दी गई है। मुझे लगता है कि यह स्क्रिप्ट विफलता के बजाय बंदरगाह के लिए मौजूदा बंधन को सफल मानेगी।
मैट जॉइनर

1
यह सच है। मेरी समस्या उसी स्क्रिप्ट के साथ थी जिसमें टाइमिंग आउट से पहले कुछ मिनट के लिए पोर्ट खुला रहता था। Thsi स्क्रिप्ट कुछ समय बाद बाहर निकलेगी और फिर से निकलेगी, जिसके बाद पोर्ट फिर से खुलेगा। यदि आपको यह जानने की ज़रूरत है कि बंदरगाह का मालिक कौन है तो आप sudo और grepping के साथ netstat -anp चलाने की कोशिश कर सकते हैं।
एंटी रयत्सला सर्किल

@ AnttiRytsöläCirclesConsult: ध्यान दें कि आपको प्रक्रिया आईडी की जांच करने की आवश्यकता हो सकती है, जैसे कि "ssh" पर मिलान प्रक्रिया नाम के रूप में अभी भी आपको यह नहीं बताता है कि वर्तमान में कौन से SSH क्लाइंट उस पोर्ट को अग्रेषित कर रहे हैं।
पिस्कोर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.