अगर रिमोट सिस्टम पर पोर्ट उपलब्ध है तो टेस्ट करें (बिना टेलनेट के)


353

पुराने दिनों में, हम telnetयह देखते थे कि दूरस्थ होस्ट पर एक पोर्ट खुला था: telnet hostname portकिसी भी होस्ट पर किसी भी पोर्ट से कनेक्ट करने का प्रयास करेगा और आपको कच्चे टीसीपी स्ट्रीम तक पहुंच प्रदान करेगा।

इन दिनों, जिन सिस्टम पर मैं काम करता हूं, उनमें टेलनेट स्थापित नहीं है (सुरक्षा कारणों से), और सभी होस्ट के लिए सभी आउटबाउंड कनेक्शन डिफ़ॉल्ट रूप से अवरुद्ध हैं। समय के साथ, यह आसान हो जाता है कि कौन से पोर्ट किस होस्ट के लिए खुले हैं।

यदि दूरस्थ सिस्टम पर कोई पोर्ट खुला है, तो परीक्षण करने का एक और तरीका है - एक सीमित संख्या में संकुल के साथ लिनक्स सिस्टम का उपयोग करना, और telnetउपलब्ध नहीं है?



मैं एक ही मुद्दा रहा था। नीचे @Subhranath Chunder द्वारा दिए गए उत्तर ने मदद की। हालाँकि, मुझे तब पता चला कि टेलनेट स्थापित करना चलाने का एक छोटा मामला था brew install telnet। इसलिए मुझे उम्मीद है कि लिनक्स उपयोगकर्ता इसके साथ yumऔर कर सकते हैं apt-get
मिग 82

जवाबों:


277

बैश कुछ समय के लिए टीसीपी और यूडीपी पोर्ट का उपयोग करने में सक्षम है । आदमी पृष्ठ से:

/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a TCP connection to the corresponding socket.
/dev/udp/host/port
    If host is a valid hostname or Internet address, and port is an integer port number
    or service name, bash attempts to open a UDP connection to the corresponding socket.

तो आप कुछ इस तरह का उपयोग कर सकते हैं:

xenon-lornix:~> cat < /dev/tcp/127.0.0.1/22
SSH-2.0-OpenSSH_6.2p2 Debian-6
^C pressed here

ता दा!


यह भी MinGW में काम करने लगता है । उदाहरण के लिए, 192.168.2.100 पर एक दूरस्थ VNC सर्वर "cat </dev/tcp/192.168.2.100/5900" का उपयोग करके "RFB 003.008" के साथ प्रतिक्रिया करता है।
पीटर मोर्टेंसन

1
@ लोर्निक्स, ठीक है, लेकिन इस मामले में मुझे बिना n -z विकल्प के उपयोग nc के साथ एक ही परिणाम प्राप्त करना है, लेकिन यह अभी भी काम नहीं करता है: # nc -v -55 127.0.0.1 18080 कनेक्शन 127.0.0.1 18080 पोर्ट / टीसीपी /*] सफल हुए! # बिल्ली </dev/tcp/127.0.0.1/18080 बस बिना किसी परिणाम के लटकी हुई है। बस तब समझना चाहता हूं जब मैं "/ dev / tcp / host / port" विकल्प का उपयोग कर सकता हूं
एलेक्जेंडर

5
@ अलेक्जेंडर ... वास्तव में, "बिना किसी परिणाम के लटका हुआ" बहुत अधिक अपेक्षित व्यवहार है। बिल्ली इनपुट के इंतजार में है। एनसी के पास अतिरिक्त स्मार्ट हैं जो इसे बिना किसी डेटा लंबित समझे और प्रयास करना बंद कर देता है। बिल्ली काफी स्मार्ट नहीं है । कोशिश करें cat < /dev/tcp/localhost/22, आपको अपना sshd हैडर मिलना चाहिए। जाहिर है, पोर्ट 18080 पर आपकी प्रक्रिया कुछ भी भेजने से पहले, कुछ का इंतजार करती है। पोर्ट 22 ( ssh ) आपको इसके संस्करण और व्हाट्सएप के साथ बधाई देता है। कोशिश करके देखो!
लोर्निक्स

1
@ लोर्निक्स, स्पष्टीकरण के लिए बहुत बहुत धन्यवाद! अब प्रतिबंध स्पष्ट है। मुझे लगता है कि बंदरगाहों की जांच करने के लिए nc का उपयोग एक पसंदीदा तरीका होना चाहिए।
एलेक्जेंड्रा

2
डॉकटर कंटेनर के साथ काम करते समय यह अविश्वसनीय रूप से सहायक था जिसमें कुछ भी स्थापित नहीं था। जल्दी से सत्यापित करने में सक्षम था कि कंटेनर में डीएनएस के माध्यम से गैर-कंटेनरीकृत डीबी तक पहुंच थी। उदाहरण: बिल्ली </ dev / tcp / hostname / 5432
माइकल हॉब्स

404

अच्छा और क्रिया! आदमी पृष्ठों से।
सिंगल पोर्ट:

nc -zv 127.0.0.1 80

कई पोर्ट:

nc -zv 127.0.0.1 22 80 8080

बंदरगाहों की सीमा:

nc -zv 127.0.0.1 20-30

6
लगता है अब तक का सबसे अच्छा जवाब है, धन्यवाद। ;-)
lpapp

6
बंद बंदरगाहों के लिए एक दूरस्थ सर्वर (उसी लैन) के लिए उबंटू 14.04 (भरोसेमंद तहर) पर कोशिश करने पर यह लटका हुआ है (यह 127 सेकंड के बाद समय समाप्त हो गया) - इस प्रकार स्क्रिप्ट में बहुत उपयुक्त नहीं है। हालांकि यह एक ऐसी सेवा के लिए काम करता था जिसमें एक बंदरगाह खुला था। "-W2" विकल्प का उपयोग करना समाधान हो सकता है।
पीटर मॉर्टेंसन

6
यूडीपी बंदरगाहों के लिए उपयोग-विकल्प।
एफ़्रेन

8
6.4 संस्करण पर ncat -z को मान्यता नहीं दी गई है। मैं बिना z ऐसा करने में सक्षम था
smishra

5
आप कई श्रेणियों की जाँच कर सकते हैं: nc -zv 127.0.0.1 22,80,8080,20-30,443-446(nc संस्करण: 1.107-4)।
बोबेल

102

नेटकैट एक उपयोगी उपकरण है:

nc 127.0.0.1 123 &> /dev/null; echo $?

0पोर्ट 123 खुला है, और 1यह बंद है , तो उत्पादन होगा ।


यह मेरे खुद के मुकाबले कहीं अधिक सुरुचिपूर्ण और स्क्रिप्ट का जवाब है। यह मेरे लिए दुर्भाग्यपूर्ण है कि सुरक्षा के प्रति सजग रहने वाले सिस्मिन telnetभी पीछे हट गए nc(हालांकि - अजीब तरह से - नहीं curlया नहीं wget)।
स्टीव एचएचएच

हाँ जो पूरी तरह से मनमाना और मूर्खतापूर्ण है।
thnee

3
चलो FORबयान शुरू करें!
चाड हैरिसन

1
बंद बंदरगाहों के लिए एक दूरस्थ सर्वर (उसी लैन) के लिए उबंटू 14.04 (भरोसेमंद तहर) पर यह कोशिश करने पर यह लटका हुआ था (यह लगभग 127 सेकंड के बाद समय समाप्त हो गया) - इस प्रकार स्क्रिप्ट में बहुत उपयुक्त नहीं है। हालांकि यह एक ऐसी सेवा के लिए काम करता था जिसमें एक पोर्ट खुला था, 0. 0. विकल्प "-w2" का उपयोग कर समाधान हो सकता है।
पीटर मोर्टेंसन

1
मुझे लगता है कि -G 2
एबी

58

एक अन्य उपकरण का उपयोग किए बिना, सबसे सरल विधि, जैसे कि socat, @ lornix के उत्तर में ऊपर वर्णित है। यह सिर्फ एक वास्तविक उदाहरण को जोड़ने के लिए है कि /dev/tcp/...यदि आप किसी अन्य सर्वर को कमांड लाइन के माध्यम से सुलभ पोर्ट प्रदान करना चाहते हैं, तो बैश के भीतर पाशुदेव-उपकरण का उपयोग कैसे किया जाएगा, इसका वास्तविक उदाहरण जोड़ना है ।

उदाहरण

कहते हैं कि मेरे नाम के नेटवर्क पर एक होस्ट है skinner

$ (echo > /dev/tcp/skinner/22) >/dev/null 2>&1 \
    && echo "It's up" || echo "It's down"
It's up

$ (echo > /dev/tcp/skinner/222) >/dev/null 2>&1 && \
    echo "It's up" || echo "It's down"
It's down

इस echo > /dev/...तरह से आप कोष्ठक में लपेटना चाहते हैं , (echo > /dev/...)इसका कारण यह है कि यदि आप नहीं करते हैं, तो नीचे दिए गए कनेक्शन के परीक्षणों के साथ, आपको इस प्रकार के संदेश दिखाई देंगे।

$ (echo > /dev/tcp/skinner/223) && echo hi
bash: connect: Connection refused
bash: /dev/tcp/skinner/223: Connection refused

इन्हें केवल /dev/nullडिवाइस पर डेटा लिखने के प्रयास के बाद से पुनर्निर्देशित नहीं किया जा सकता है /dev/tcp। इसलिए हम सब-आउटपुट को एक सब-कमांड के भीतर कैप्चर करते हैं, यानी सब-कमांड (...cmds...)के आउटपुट को रीडायरेक्ट करते हैं।


यह उत्कृष्ट है। काश यह ऊपर तक मतदान हो जाता। मैंने केवल इस पृष्ठ को नीचे पढ़ा है क्योंकि मैंने इसे बंद करने से पहले गलती से स्क्रॉल किया था।
फिर भी

@ ओकुमा.टनी - हाँ, यह हमेशा क्यू के साथ एक मुद्दा है जिसके कई उत्तर हैं 8-)। हालांकि प्रतिक्रिया के लिए धन्यवाद, यह सराहना की है।
स्लम

46

मैंने पाया कि curlकाम को इसी तरह से किया जा सकता है telnet, और curlयहां तक ​​कि आपको यह भी बताएगा कि कौन सा प्रोटोकॉल उम्मीद करता है।

पहले तर्क के रूप में होस्टनाम और पोर्ट से एक HTTP यूआरआई का निर्माण करें curl। यदि curlकनेक्ट हो सकता है, तो यह एक प्रोटोकॉल बेमेल और निकास की रिपोर्ट करेगा (यदि श्रोता वेब सेवा नहीं है)। यदि curlआप कनेक्ट नहीं कर सकते हैं, तो यह समय समाप्त हो जाएगा।

उदाहरण के लिए, होस्ट 10.0.0.99 पर पोर्ट 5672 या तो फ़ायरवॉल द्वारा बंद या अवरुद्ध है:

$ curl http://10.0.0.99:5672
curl: (7) couldn't connect to host

हालाँकि, एक अलग प्रणाली से, पोर्ट 5672 होस्ट 10.0.0.99 पर पहुँचा जा सकता है, और एक AMQP श्रोता को चलाने के लिए प्रतीत होता है।

$ curl http://10.0.0.99:5672
curl: (56) Failure when receiving data from the peer
AMQP

विभिन्न संदेशों के बीच अंतर करना महत्वपूर्ण है: पहली विफलता इसलिए थी क्योंकि curlपोर्ट से कनेक्ट नहीं हो सकी। दूसरी विफलता एक सफलता परीक्षण है, हालांकि curlएएमक्यूपी श्रोता के बजाय एक HTTP श्रोता की अपेक्षा की जाती है।


5
यदि कर्ल उपलब्ध नहीं है, तो विकट हो सकता है। wget -qS -O- http://ip.add.re.ss:portप्रभावी रूप से एक ही काम करना चाहिए।
एक CVn

4
यह भी एक hostname के साथ काम करता है, पूर्व। curl myhost:22
에이 에이

यह गलत हो सकता है। मैं एक tomcat सेवा चला रहा हूं, लेकिन 404 त्रुटि हो रही है। # कर्ल -क 192.168.194.4:6443 <html> <head> <title> Apache Tomcat / 7.0.34 - त्रुटि रिपोर्ट </ शीर्षक> <style> <! - H1 --- HR {color: # 525576;} -> </ style> </ head> <body> <h1> HTTP Status 404 - / </ h1> <HR size = "1" noshade = "noshade"> <p> <b> टाइप </ b> स्थिति रिपोर्ट </ p> <p> <b> संदेश </ b> <u> / </ u> </ p> <p> <b> विवरण </ b> <u> अनुरोधित संसाधन उपलब्ध नहीं है। </ u> </ p> <HR size = "1" noshade = "noshade"> <h3> Apache Tomcat / 7.0.34 </ h3> </ body> </ html>

इसी तरह के दृष्टिकोण के साथ मेरी पोस्ट देखें ।
कीनॉर्ब

12
[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.193.173 6443
nc: connect to 192.168.193.173 port 6443 (tcp) failed: Connection refused

[admin@automation-server 1.2.2]# nc -v -z -w2 192.168.194.4 6443
Connection to 192.168.194.4 6443 port [tcp/sun-sr-https] succeeded!

आशा है कि यह आपकी समस्या हल कर देगा :)


1
हां, यह बेहतर है - बंद बंदरगाहों के लिए लगभग तुरंत बाहर का समय।
पीटर मोर्टेंसन

1
क्या यह हमेशा TCP का उपयोग करता है या UDP की जाँच करने के लिए इसे प्राप्त करने का कोई तरीका है?
kmoe

9

यहाँ एक लाइनर है:

</dev/tcp/localhost/11211 && echo Port is open || echo Port is closed

बैश सिंटैक्स का उपयोग करके @lornix उत्तर में समझाया गया है ।

अधिक जानकारी के लिए, जाँच करें: उन्नत बैश-स्क्रिप्टिंग गाइड: अध्याय 29। /devऔर/proc


बंद बंदरगाहों के लिए समय सीमा क्या है?
तिलो

6

मैं पूरे दिन संघर्ष कर रहा था क्योंकि इनमें से कोई भी जवाब मेरे लिए काम नहीं कर रहा था। समस्या का नवीनतम संस्करण है कि ncअब और नहीं है -z, झंडा जबकि टीसीपी के माध्यम से सीधी पहुँच (@lornix और @slm के अनुसार के रूप में) में विफल रहता है जब होस्ट तक नहीं पहुंचा है। मुझे अंततः यह पृष्ठ मिला , जहाँ मुझे अंततः एक नहीं बल्कि दो काम करने के उदाहरण मिले:

  1. nc -w1 127.0.0.1 22 </dev/null

    ( -wध्वज टाइमआउट का ध्यान रखता है, और ध्वज की </dev/nullजगह लेता है -z)

  2. timeout 1 bash -c '(echo > /dev/tcp/127.0.0.1/22) >/dev/null 2>&1'

    ( timeoutकमांड टाइमआउट का ध्यान रखती है, और बाकी @slm से है)

फिर, परिणाम निकालने के लिए बस का उपयोग करें &&और / या ||(या भी $?)। उम्मीद है, किसी को यह जानकारी उपयोगी लगेगी।


4

@Kenorb और @Azukikuru के उत्तरों को मिलाकर आप पोर्ट ओपन / बंद / फ़ायरवॉल परीक्षण कर सकते हैं।

timeout 1 bash -c '</dev/tcp/127.0.0.1/22 && echo Port is open || echo Port is closed' || echo Connection timeout

किसी भी बंदरगाह तक पहुंचने के लिए कर्ल के साथ एक और दृष्टिकोण

curl telnet://127.0.0.1:22

3

यहां एक फ़ंक्शन है जो आपके सिस्टम पर इंस्टॉल किए गए तरीकों पर निर्भर करता है:

# Check_port <address> <port> 
check_port() {
if [ "$(which nc)" != "" ]; then 
    tool=nc
elif [ "$(which curl)" != "" ]; then
     tool=curl
elif [ "$(which telnet)" != "" ]; then
     tool=telnet
elif [ -e /dev/tcp ]; then
      if [ "$(which gtimeout)" != "" ]; then  
       tool=gtimeout
      elif [ "$(which timeout)" != "" ]; then  
       tool=timeout
      else
       tool=devtcp
      fi
fi
echo "Using $tool to test access to $1:$2"
case $tool in
nc) nc -v -G 5 -z -w2 $1 $2 ;;
curl) curl --connect-timeout 10 http://$1:$2 ;;
telnet) telnet $1 $2 ;;
gtimeout)  gtimeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
timeout)  timeout 1 bash -c "</dev/tcp/${1}/${2} && echo Port is open || echo Port is closed" || echo Connection timeout ;;
devtcp)  </dev/tcp/${1}/${2} && echo Port is open || echo Port is closed ;;
*) echo "no tools available to test $1 port $2";;
esac

}
export check_port

2

यह आपके बॉक्स पर उपलब्ध नहीं होना चाहिए, लेकिन इसके साथ प्रयास करें nmap


4
nmapएक अच्छा उपकरण है, लेकिन इन प्रणालियों पर उपलब्ध नहीं है। डाउनलोड करने के बजाय nmap, इसे संकलित करें, इसे मेरे घर निर्देशिका में स्थापित करें, फिर इसे अन्य सभी प्रणालियों पर कॉपी करें, मैं सबसे लिनक्स इंस्टॉलेशन में उपलब्ध मौजूदा टूल का उपयोग करके एक रास्ता खोजने की उम्मीद कर रहा था।
स्टीव एचएचएच

1

संदर्भ के लिए, @peperunas के उत्तर पर विस्तार:

परीक्षण करने के लिए नैम्प का उपयोग करने का तरीका है:

nmap -p 22 127.0.0.1

(प्रदर्शन प्रयोजनों के लिए उपरोक्त उदाहरण लोकलहोस्ट का उपयोग करता है)


0

यदि आप सिस्टम से अधिक परीक्षण करना चाहते हैं, तो आप ऐसे कार्यों के लिए हमारे परीक्षण उपकरण dda-serverpec ( https://github.com/DomainDrivenArchitecture/dda-serverspec-crate ) का उपयोग कर सकते हैं । आप अपनी अपेक्षा को परिभाषित कर सकते हैं

{:netcat [{:host "mywebserver.com" :port "443"}
          {:host "telnet mywebserver.com" :port "80"}
          {:host "telnet mywebserver.com" :port "8443"}]}

और इन अपेक्षाओं का परीक्षण या तो लोकलहोस्ट के खिलाफ या रिमोट होस्ट (ssh द्वारा कनेक्ट) के खिलाफ करें। दूरस्थ परीक्षणों के लिए आपको एक लक्ष्य निर्धारित करना है:

{:existing [{:node-name "test-vm1"
             :node-ip "35.157.19.218"}
            {:node-name "test-vm2"
             :node-ip "18.194.113.138"}]
 :provisioning-user {:login "ubuntu"}}

आप के साथ परीक्षण चला सकते हैं java -jar dda-serverspec.jar --targets targets.edn serverspec.edn

हुड के तहत हम ऊपर के रूप में netcat का उपयोग कर रहे हैं ...

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