सवाल परीक्षण करें कि रिमोट सिस्टम पर एक पोर्ट पहुंच योग्य है (टेलनेट के बिना)


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

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

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


272
2017-07-19 16:54


मूल


सम्बंधित: रिमोट होस्ट पर एक बंदरगाह की स्थिति की जांच करें एसओ पर - kenorb


जवाब:


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

/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

ता दा!


228
2017-07-22 10:37



यह भी काम करता प्रतीत होता है MinGW। उदाहरण के लिए, एक रिमोट VNC 1 9 2.168.2.100 पर सर्वर "बिल्ली </dev/tcp/192.168.2.100/5900" का उपयोग करके "आरएफबी 003.008" के साथ प्रतिक्रिया करता है। - Peter Mortensen
हालांकि बंदरगाहों पर जो खुले नहीं थे, यह 22 सेकंड के बाद समाप्त हो गया (कोशिश की गई उबंटू 14.04 (विश्वसनीय ताहर) एक दूरस्थ सर्वर के लिए)। दिलचस्प बात यह है कि टाइमआउट अवधि एनसी के लिए एक से कम है (देखें थनी का जवाब)। - Peter Mortensen
@lornix, ठीक है, लेकिन इस मामले में मुझे nc बिना -z विकल्प के साथ एक ही परिणाम प्राप्त करना होगा, लेकिन यह अभी भी काम नहीं करता है: # nc -v -w5 127.0.0.1 18080 127.0.0.1 18080 पोर्ट से कनेक्शन [टीसीपी /*] सफल हुए! # बिल्ली </dev/tcp/127.0.0.1/18080 बस बिना किसी परिणाम के लटकता है। बस समझना है कि मैं "/ dev / tcp / host / port" विकल्प का उपयोग कर सकता हूं - Alexandr
@Alexandr ... वास्तव में, "बिना किसी परिणाम के लटकता है" काफी ज्यादा अपेक्षित व्यवहार है। बिल्ली इनपुट के लिए इंतजार कर रहा है। nc अतिरिक्त स्मारक हैं ताकि यह डेटा को लंबित समझने में सक्षम हो और कोशिश करना बंद कर दे। बिल्ली नहीं है काफी स्मार्ट के रूप में प्रयत्न cat < /dev/tcp/localhost/22, आपको अपना एसएसडीडी हेडर प्राप्त करना चाहिए। जाहिर है, पोर्ट 18080 पर आपकी प्रक्रिया कुछ भी भेजने से पहले कुछ आने की प्रतीक्षा करती है। पोर्ट 22 (ssh) आपको इसके संस्करण के साथ धन्यवाद और क्या नहीं। कोशिश करके देखो! - lornix
@ लोर्निक्स, स्पष्टीकरण के लिए आपको बहुत बहुत धन्यवाद! अब प्रतिबंध स्पष्ट है। मुझे लगता है कि एनसी का उपयोग बंदरगाहों की जांच करने के लिए एक पसंदीदा तरीका होना चाहिए। - Alexandr


अच्छा और verbose! मैन पेज से।
एकल बंदरगाह:

nc -zv 127.0.0.1 80

एकाधिक बंदरगाहों:

nc -zv 127.0.0.1 22 80 8080

बंदरगाहों की रेंज:

nc -zv 127.0.0.1 20-30

319
2017-12-03 21:34



धन्यवाद, सबसे अच्छा जवाब होने के लिए लगता है, धन्यवाद। ;-) - lpapp
कोशिश की जब यह फांसी दी उबंटू 14.04 (ट्रस्टी ताहर) बंद बंदरगाहों के लिए एक दूरस्थ सर्वर (उसी लैन) के लिए (यह 127 सेकंड के बाद समाप्त हो गया) - इस प्रकार स्क्रिप्ट में बहुत उपयुक्त नहीं है। यह एक सेवा के लिए काम किया था, जिसमें एक बंदरगाह खुला था। विकल्प "-w2" का उपयोग समाधान हो सकता है। - Peter Mortensen
यूडीपी बंदरगाहों के लिए यूयू विकल्प का उपयोग करें। - Efren
Ncat -z के संस्करण 6.4 पर पहचाना नहीं गया है। मैं जेड के बिना करने में सक्षम था - smishra
आप इसके साथ कई श्रेणियों की जांच कर सकते हैं: nc -zv 127.0.0.1 22,80,8080,20-30,443-446 (एनसी संस्करण: 1.107-4)। - bobbel


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

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

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


96
2017-07-19 18:07



यह मेरे खुद से कहीं अधिक सुरुचिपूर्ण और पटकथात्मक उत्तर है। यह मेरे लिए दुर्भाग्यपूर्ण है कि सुरक्षा-जागरूक sysadmins जो रोक दिया telnet भी रोक दिया nc (हालांकि - अजीब - नहीं curl या wget)। - Steve HHH
हां यह पूरी तरह मनमानी और मूर्ख है। - thnee
चलो FOR बयान शुरू! - Chad Harrison
कोशिश की जब यह फांसी दी उबंटू 14.04 (ट्रस्टी ताहर) बंद बंदरगाहों के लिए एक दूरस्थ सर्वर (उसी लैन) के लिए (यह लगभग 127 सेकंड के बाद समाप्त हो गया) - इस प्रकार स्क्रिप्ट में बहुत उपयुक्त नहीं है। यह काम करता था हालांकि एक सेवा के लिए जो एक बंदरगाह खुला था, लौट रहा था 0. विकल्प का उपयोग करना "-w2" समाधान हो सकता है। - Peter Mortensen
मुझे लगता है -G 2 टीसीपी टाइमआउट के लिए अधिक उपयुक्त होगा - A B


सबसे आसान तरीका, किसी अन्य उपकरण का उपयोग किए बिना, जैसे कि socatजैसा कि उपरोक्त @ लोर्निक्स के उत्तर में वर्णित है। यह सिर्फ एक वास्तविक उदाहरण जोड़ने के लिए है कि कोई psuedo-device का उपयोग कैसे करेगा /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...) और सब-कमांड के आउटपुट को रीडायरेक्ट करें।


51
2017-09-02 17:59



यह उत्कृष्ट है। इच्छा है कि इसे शीर्ष पर वोट मिलेगा। मैंने इसे पृष्ठ से बहुत दूर पढ़ा है क्योंकि मैंने इसे बंद करने से पहले गलती से स्क्रॉल किया था। - Still.Tony
@ Okuma.Tony - हाँ यह हमेशा क्यू के साथ एक मुद्दा है जिसमें कई जवाब हैं 8-)। हालांकि प्रतिक्रिया के लिए धन्यवाद, इसकी सराहना की है। - slm


मैने पाया कि 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

हालांकि, एक अलग सिस्टम से, मेजबान 10.0.0.99 पर पोर्ट 5672 तक पहुंचा जा सकता है, और ऐसा लगता है कि एएमक्यूपी श्रोता चल रहा है।

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

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


36
2017-07-19 17:05



यदि कर्ल उपलब्ध नहीं है, तो हो सकता है कि wget हो। wget -qS -O- http://ip.add.re.ss:portप्रभावी ढंग से एक ही काम करना चाहिए। - α CVn
यह एक होस्टनाम के साथ भी काम करता है, पूर्व। curl myhost:22। - 에이바
यह गलत हो सकता है। मैं एक टोमकैट सेवा चल रहा हूं, लेकिन 404 त्रुटि प्राप्त कर रहा हूं। # कर्ल-के 192.168.194.4:6443 <html> <head> <title> अपाचे टॉमकैट / 7.0.34 - त्रुटि रिपोर्ट </ title> <style> <! - एच 1 --- एचआर {रंग: # 525D76;} -> </ style> </ सिर> <body> <h1> HTTP स्थिति 404 - / </ h1> <एचआर आकार = "1" noshade = "noshade"> <p> <b> टाइप करें </ b> स्थिति रिपोर्ट </ p> <p> <b> संदेश </ b> <u> / </ u> </ p> <p> <b> विवरण </ b> <u> अनुरोधित संसाधन उपलब्ध नहीं है। </ u> </ p> < एचआर आकार = "1" noshade = "noshade"> <h3> अपाचे टॉमकैट / 7.0.34 </ h3> </ body> </ html> - Mohammad Shahid Siddiqui
देखो मेरा पद समान दृष्टिकोण के साथ। - kenorb


[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!

उम्मीद है कि यह आपकी समस्या हल करता है :)


8
2018-06-02 06:27



हां, यह बेहतर है - बंद बंदरगाहों के लिए लगभग तुरंत बाहर समय। - Peter Mortensen
क्या यह हमेशा टीसीपी का उपयोग करता है या यूडीपी की जांच करने के लिए कोई तरीका है? - kmoe


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

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

बैश वाक्यविन्यास का उपयोग करके समझाया @ लोर्निक्स जवाब

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


7
2018-03-16 11:21