परीक्षण यदि दूरस्थ टीसीपी पोर्ट एक शेल स्क्रिप्ट से खुला है


297

अगर शेल स्क्रिप्ट के अंदर से एक दूरस्थ सर्वर पर एक दिया हुआ टीसीपी पोर्ट खुला है, तो मैं ठीक से परीक्षण के लिए एक त्वरित और सरल विधि की तलाश कर रहा हूं।

मैं इसे टेलनेट कमांड के साथ करने में कामयाब रहा हूं, और पोर्ट के खुलने पर यह ठीक काम करता है, लेकिन यह टाइमआउट नहीं लगता जब यह नहीं होता है और बस वहीं लटक जाता है ...

यहाँ एक नमूना है:

l_TELNET=`echo "quit" | telnet $SERVER $PORT | grep "Escape character is"`
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

मुझे या तो एक बेहतर तरीके की आवश्यकता है, या टेलनेट को टाइमआउट के लिए मजबूर करने का एक तरीका है यदि यह उदाहरण के लिए 8 सेकंड से कम में कनेक्ट नहीं होता है, और कुछ मैं वापस शेल (रिटर्न कोड, या स्टडआउट में स्ट्रिंग) में पकड़ सकता हूं।

मुझे पर्ल विधि का पता है, जो IO :: सॉकेट :: INET मॉड्यूल का उपयोग करता है और एक सफल स्क्रिप्ट लिखी है जो पोर्ट का परीक्षण करती है, लेकिन यदि संभव हो तो पर्ल का उपयोग करने से बचना चाहिए।

नोट: यह वही है जो मेरा सर्वर चल रहा है (जहां मुझे इसे चलाने की आवश्यकता है)

SunOS 5.10 Generic_139556-08 i86pc i386 i86pc


Netcat या Nmap के बारे में क्या ?
यिर्मयाह विलकॉक

जवाब उम्मीद के साथ झूठ बोला। हमने एक सरल स्क्रिप्ट लिखी थी जो हमें आवश्यक पोर्ट पर एक टेलनेट भेजता है, जिसमें 8 सेकंड का समय समाप्त होता है। वहाँ से भी लेने के लिए बहुत सारे उदाहरण हैं। हम इस पोस्ट को बंद कर देते हैं: unix.com/shell-programming-scripting/…
यानिक

1
check_tcp github.com/monitoring-plugins/monitoring-plugins से यह कर सकते हैं, जिसमें स्ट्रिंग में प्रवेश करना और एक अपेक्षित उत्तर के लिए जाँच करना शामिल है।

जवाबों:


452

जैसा कि बी रोड्स ने बताया है, ncकाम करेंगे। इसका उपयोग करने के लिए एक अधिक कॉम्पैक्ट तरीका:

nc -z <host> <port>

यह तरीका ncकेवल तभी जाँच करेगा कि पोर्ट खुला है, सफलता के साथ 0 से बाहर, विफलता पर 1।

एक त्वरित इंटरैक्टिव चेक के लिए (5 सेकंड के समय के साथ):

nc -z -v -w5 <host> <port>

48
सेंटोस 7 डिफॉल्ट नेम नेटकैट का उपयोग किया है और इसमें -z विकल्प नहीं है।
जोलस्टार

7
यह आरएचईएल / सेंटोस में काम नहीं करता है। उन विकृतियों के लिए आपको करने की आवश्यकता है: nc -vn <host> <port>
जस्टिन डेन्हॉवर

2
एफडब्ल्यूआईडब्ल्यू, मैंने अपने जवाब को पूरी तरह से एक उदाहरण के साथ ओवरहाल कर दिया है , अलग से
आरएचईएल

4
मैक पर कम से कम, आपको -G#टाइमआउट के अलावा / से अलग कनेक्शन टाइमआउट सेट करने के लिए जोड़ना पड़ सकता है -w#, जो मूल रूप से रीड टाइमआउट के रूप में कार्य करता है।
डॉकटोर जे

1
@jolestar आप -zविकल्प प्राप्त करने के लिए Centos 7 पर मैन्युअल रूप से Ncat को अपग्रेड कर सकते हैं । आप इस पर विचार करना चाह सकते हैं: unix.stackexchange.com/questions/393762/…
डेमियन

150

यह करने के लिए -zऔर -w TIMEOUTविकल्पों के साथ करना काफी आसान है nc, लेकिन सभी सिस्टम ncस्थापित नहीं हैं। यदि आपके पास बैश का हालिया संस्करण है, तो यह काम करेगा:

# Connection successful:
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/80'
$ echo $?
0

# Connection failure prior to the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/sfsfdfdff.com/80'
bash: sfsfdfdff.com: Name or service not known
bash: /dev/tcp/sfsfdfdff.com/80: Invalid argument
$ echo $?
1

# Connection not established by the timeout
$ timeout 1 bash -c 'cat < /dev/null > /dev/tcp/google.com/81'
$ echo $?
124

यहां जो timeoutकुछ हो रहा है, वह उपकमांड को चलाएगा और इसे मार देगा यदि यह निर्दिष्ट समय सीमा के भीतर बाहर नहीं निकलता है (उपरोक्त उदाहरण में 1 सेकंड)। इस मामले bashमें उपकमांड है और अपने विशेष / dev / tcp हैंडलिंग का उपयोग करके सर्वर और निर्दिष्ट पोर्ट के लिए कनेक्शन खोलने और खोलने का प्रयास करता है। यदि bashटाइमआउट के भीतर कनेक्शन खोल सकते हैं, catतो इसे तुरंत बंद कर देंगे (क्योंकि यह पढ़ रहा है /dev/null) और एक स्टेटस कोड के साथ बाहर निकलें 0जिसके माध्यम से प्रचार होगा bashऔर फिर timeout। यदि bashनिर्दिष्ट टाइमआउट से पहले कनेक्शन विफलता मिलती है, तो bash1 के एक्जिट कोड के साथ बाहर निकल timeoutजाएगा जो भी वापस आ जाएगा। और अगर बैश एक कनेक्शन स्थापित करने में सक्षम नहीं है और निर्दिष्ट टाइमआउट समाप्त हो जाता है, तोtimeoutमार देगा bashऔर 124 की स्थिति के साथ बाहर निकल जाएगा ।


1
है /dev/tcpलिनक्स अलावा अन्य सिस्टम पर उपलब्ध है? विशेष रूप से मैक के बारे में क्या?
पतरस

8
/ Dev / tcp चीज़ बैश की विशेषता है, इसलिए हाँ। हालाँकि ऐसा लगता है कि macs का समय समाप्त नहीं हुआ है ...
23

1
@onlynone - ऐसा लगता है कि timeoutFreeBSD में भी मौजूद नहीं है, और मेरे पुराने उबंटू बॉक्स पर यह एक इंस्टॉल करने योग्य पैकेज है, लेकिन डिफ़ॉल्ट रूप से नहीं है। अगर टाइमआउट या नेटकैट जैसे थर्ड पार्टी टूल्स के बिना अकेले बैश में ऐसा करने का कोई तरीका होता, तो बहुत अच्छा होगा।
ग्राहम

3
बस यह उल्लेख करना चाहता था कि यह timeoutGNU कोरुटिल्स का हिस्सा प्रतीत होता है, और होमब्रे के साथ मैक पर स्थापित किया जा सकता है brew install coreutils:। यह तब उपलब्ध होगा gtimeout
onlynone

1
@Wildcard एक बैश परिवर्तन लॉग सुझाव देता है bash-2.04-devel, हालांकि होस्ट नामों के लिए समर्थन में जोड़ा जा सकता है bash-2.05-alpha1
एक्यूमेनस

109

टीओसी:

  • बैश और का उपयोग करना timeout
    • आदेश
    • उदाहरण
  • का उपयोग करते हुए nc
    • आदेश
    • आरएचईएल 6 (एनसी 1.84)
      • स्थापना
      • उदाहरण
    • आरएचईएल 7 (एनएएमपी-एनसीएटी-6.40)
      • स्थापना
      • उदाहरण
  • टिप्पणियों

बैश का उपयोग करना और timeout:

ध्यान दें कि timeoutआरएचईएल 6+ के साथ मौजूद होना चाहिए, या वैकल्पिक रूप से जीएनयू कोर्यूटिल्स 8.22 में पाया जाता है। MacOS पर, इसका उपयोग करके इंस्टॉल brew install coreutilsकरें और इसे इस रूप में उपयोग करें gtimeout

कमान:

$ timeout $TIMEOUT_SECONDS bash -c "</dev/tcp/${HOST}/${PORT}"; echo $?

यदि होस्ट और पोर्ट को पैरामीट्रिक करते हैं, तो उन्हें ऊपर ${HOST}और नीचे निर्दिष्ट करना सुनिश्चित करें ${PORT}। उन्हें केवल $HOSTऔर केवल $PORTब्रेसिज़ के बिना निर्दिष्ट न करें ; यह इस मामले में काम नहीं करेगा।

उदाहरण:

सफलता:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/80"; echo $?
0

विफलता:

$ timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
124

यदि आपको बाहर निकलने की स्थिति का संरक्षण करना चाहिए bash,

$ timeout --preserve-status 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?
143

का उपयोग कर nc:

ध्यान दें कि ncRHEL 7 पर एक पिछड़ा असंगत संस्करण स्थापित हो जाता है।

कमान:

ध्यान दें कि नीचे दी गई कमांड अद्वितीय है कि यह RHEL 6 और 7. दोनों के लिए समान है। यह सिर्फ स्थापना और आउटपुट है जो अलग-अलग हैं।

$ nc -w $TIMEOUT_SECONDS -v $HOST $PORT </dev/null; echo $?

आरएचईएल 6 (एनसी 1.84):

स्थापना:

$ sudo yum install nc

उदाहरण:

सफलता:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Connection to canyouseeme.org 80 port [tcp/http] succeeded!
0
विफलता:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
nc: connect to canyouseeme.org port 81 (tcp) timed out: Operation now in progress
1

यदि होस्टनाम कई आईपी में मैप करता है, तो उपरोक्त विफलता कमांड कई या सभी के माध्यम से चक्र करेगा। उदाहरण के लिए:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
nc: connect to microsoft.com port 81 (tcp) timed out: Operation now in progress
1

आरएचईएल 7 (एनएएमपी-एनसीएटी-6.40):

स्थापना:

$ sudo yum install nmap-ncat

उदाहरण:

सफलता:
$ nc -w 2 -v canyouseeme.org 80 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connected to 52.202.215.126:80.
Ncat: 0 bytes sent, 0 bytes received in 0.22 seconds.
0
विफलता:
$ nc -w 2 -v canyouseeme.org 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection timed out.
1

यदि होस्टनाम कई आईपी में मैप करता है, तो उपरोक्त विफलता कमांड कई या सभी के माध्यम से चक्र करेगा। उदाहरण के लिए:

$ nc -w 2 -v microsoft.com 81 </dev/null; echo $?
Ncat: Version 6.40 ( http://nmap.org/ncat )
Ncat: Connection to 104.43.195.251 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.100.122.175 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 23.96.52.53 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection to 191.239.213.197 failed: Connection timed out.
Ncat: Trying next address...
Ncat: Connection timed out.
1

टिप्पणियों:

-v( --verbose) तर्क और echo $?आदेश केवल व्याख्या के लिए निश्चित रूप से कर रहे हैं।


3
timeout 2 bash -c "</dev/tcp/canyouseeme.org/81"; echo $?बहुत अच्छी बात है!
ipeacocks

जोड़ने के 2>&1लिए प्रतिध्वनि की स्थिति नहीं है result_test=$(nc -w 2 $ip_addreess 80 </dev/null 2>&1 ; echo $?)
सान्या स्नेक्स

55

साथ netcatआप देख सकते हैं कि एक बंदरगाह इस तरह खुला है:

nc my.example.com 80 < /dev/null

ncयदि TCP पोर्ट को खोला गया था, और विफलता (आमतौर पर रिटर्न कोड 1) अगर यह TCP कनेक्शन नहीं बना पाती है, तो रिटर्न वैल्यू सफल होगी।

ncजब आप यह कोशिश करेंगे, तो कुछ संस्करण हैंग हो जाएंगे, क्योंकि वे एंड-ऑफ-फ़ाइल प्राप्त करने के बाद भी अपने सॉकेट के आधे भेजने को बंद नहीं करते हैं /dev/null। मेरे अपने उबंटू लैपटॉप पर (18.04), netcat-openbsdमैंने जो नेटकैट का संस्करण स्थापित किया है वह एक वर्कअराउंड प्रदान करता है: -Nतत्काल परिणाम प्राप्त करने के लिए विकल्प आवश्यक है:

nc -N my.example.com 80 < /dev/null

1
फ़्लेवर के लिए महान कार्य करता है जो ध्वज का ncसमर्थन नहीं करता है -w
डेविड डॉसॉट

5
धन्यवाद - बिना -zसमर्थन के एनसी के संस्करणों के लिए भी काम करता है - आरएचईएल / सेंटोस 7 पर काम करता है, उदाहरण के लिए
एंड्रयू

1
हालांकि यह दृष्टिकोण अच्छा है, -wआवश्यक है, जो एक स्क्रिप्ट में इस्तेमाल होने पर कमांड दस सेकंड से अधिक के लिए लटका सकता है। मैंने एक उत्तर लिखा है जिसमें शामिल है -w
एक्यूमेनस

2
+1 यह बहुत अच्छा है क्योंकि एनसी अल्पाइन लाइनक्स और ubuntu दोनों के साथ मानक आता है। शायद दूसरों को। जब आप रीमोट किए जा सकते हैं और नहीं कर सकते तो अतिरिक्त स्थापित करने की कोई आवश्यकता नहीं है। इसके लिए धन्यवाद! मैं जोड़ सकता हूं,nc host port -w 2 && echo it works
std''OrgnlDave

2
मैं पसंद करता हूं nc -vz localhost 3306। यह अधिक वर्बोज़ आउटपुट देता है। इसे मैक पर ही आज़माया।
EFreak

29

टीसीपी / यूडीपी कनेक्शन के लिए छद्म-उपकरण फ़ाइलों का उपयोग करने वाले बैश में सीधे आगे है। यहाँ स्क्रिप्ट है:

#!/usr/bin/env bash
SERVER=example.com
PORT=80
</dev/tcp/$SERVER/$PORT
if [ "$?" -ne 0 ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

परिक्षण:

$ ./test.sh 
Connection to example.com on port 80 succeeded

यहाँ एक-लाइनर (बैश सिंटैक्स) है:

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

ध्यान दें कि कुछ सर्वर SYN बाढ़ के हमलों से सुरक्षित फ़ायरवॉल हो सकते हैं, इसलिए आपको एक टीसीपी कनेक्शन टाइमआउट (~ 75secs) का अनुभव हो सकता है। टाइमआउट समस्या को हल करने के लिए, प्रयास करें:

timeout 1 bash -c "</dev/tcp/stackoverflow.com/81" && echo Port open. || echo Port closed.

देखें: टीसीपी कनेक्ट कैसे कम करें () सिस्टम कॉल टाइमआउट?


1
@ABB यह सर्वर के फ़ायरवॉल कॉन्फ़िगरेशन से संबंधित है जो किसी भी SYN बाढ़ के हमलों को रोकने के लिए कोई प्रतिक्रिया नहीं देता है। दौड़ना telnet canyouseeme.org 81भी लटक गया। यह आपकी समय सीमा के द्वारा नियंत्रित किया जाता है जो संभवतः बैश में हार्डकोडेड होते हैं। देखें: कमी टीसीपी कनेक्ट () सिस्टम कॉल टाइमआउट
केनोरब

Paradrization के लिए, अब यह निर्दिष्ट करना आवश्यक है $SERVERऔर $PORTब्रेसिज़ के साथ, कम से कम ${SERVER}और के रूप में ${PORT}
एक्यूमेनस

13

मुझे कई गिट रिपॉजिटरी पर काम करने के लिए अधिक लचीले समाधान की आवश्यकता थी इसलिए मैंने 1 और 2 के आधार पर निम्नलिखित श कोड लिखे । आप 22 के स्थान पर gitlab.com और अपने पोर्ट के बजाय अपने सर्वर पते का उपयोग कर सकते हैं।

SERVER=gitlab.com
PORT=22
nc -z -v -w5 $SERVER $PORT
result1=$?

#Do whatever you want

if [  "$result1" != 0 ]; then
  echo  'port 22 is closed'
else
  echo 'port 22 is open'
fi

1
धन्यवाद! यह मेरे जीवन को /etc/rc.local
Shahin Khaled

10

यदि आप ksh या bash का उपयोग कर रहे हैं, तो वे दोनों / dev / tcp / IP / PORT निर्माण का उपयोग करते हुए सॉकेट से IO पुनर्निर्देशन का समर्थन करते हैं । इस में कॉर्न खोल उदाहरण मैं पुनः निर्देशित कर रहा हूँ कोई सेशन के ( : ) एसटीडी में एक सॉकेट से:

W$ python -m SimpleHTTPServer &
[1]     16833
Serving HTTP on 0.0.0.0 port 8000 ...
W$ : </dev/tcp/127.0.0.1/8000

यदि सॉकेट नहीं खुला है तो शेल एक त्रुटि प्रिंट करता है:

W$ : </dev/tcp/127.0.0.1/8001
ksh: /dev/tcp/127.0.0.1/8001: cannot open [Connection refused]

आप इसे एक परीक्षण के रूप में उपयोग कर सकते हैं यदि एक शर्त में:

SERVER=127.0.0.1 PORT=8000
if (: < /dev/tcp/$SERVER/$PORT) 2>/dev/null
then
    print succeeded
else
    print failed
fi

नो-ऑप एक उपधारा में है इसलिए मैं एसटीडी-गलत दूर फेंक सकता हूं यदि एसटीडी-इन पुनर्निर्देशन विफल हो जाता है।

मैं अक्सर HTTP पर संसाधन की उपलब्धता की जांच के लिए / dev / tcp का उपयोग करता हूं :

W$ print arghhh > grr.html
W$ python -m SimpleHTTPServer &
[1]     16863
Serving HTTP on 0.0.0.0 port 8000 ...
W$ (print -u9 'GET /grr.html HTTP/1.0\n';cat <&9) 9<>/dev/tcp/127.0.0.1/8000
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.6.1
Date: Thu, 14 Feb 2013 12:56:29 GMT
Content-type: text/html
Content-Length: 7
Last-Modified: Thu, 14 Feb 2013 12:55:44 GMT

arghhh
W$ 

यह वन-लाइनर सॉकेट से पढ़ने और लिखने के लिए फाइल डिस्क्रिप्टर 9 खोलता है , HTTP GET को सॉकेट में प्रिंट करता catहै और सॉकेट से पढ़ने के लिए उपयोग करता है।


1
@ABB मुझे लगता है कि इसका मतलब है कि यह लंबे समय तक लटका रहता है यदि पोर्ट जवाब नहीं दे रहा है, उदाहरण के लिए जब फ़िल्टर किया जाता है, या आईपी पर कुछ भी नहीं है। एक बंद पोर्ट विलंब का कारण नहीं बनता है यदि पोर्ट सक्रिय रूप से कनेक्शन से इनकार करता है। कई उद्देश्यों के लिए यह काफी स्वीकार्य है।
mc0e

इस तकनीक को पहले से ही इस जवाब से पहले kenorb द्वारा उत्तर में पोस्ट किया गया था । वैसे भी, बड़ी बात यह है कि यह लंबे समय तक लटका रहता है अगर पोर्ट जवाब नहीं दे रहा है। उदाहरण के लिए, कोशिश करें </dev/tcp/canyouseeme.org/80और फिर </dev/tcp/canyouseeme.org/81
एक्यूमेनस

9

एक पुराने प्रश्न के दौरान, मैंने अभी इसके एक संस्करण से निपटा है, लेकिन यहाँ कोई भी समाधान लागू नहीं था, इसलिए मुझे एक और मिला, और मैं इसे पोस्टरिटी के लिए जोड़ रहा हूँ। हां, मुझे पता है कि ओपी ने कहा कि वे इस विकल्प के बारे में जानते थे और यह उनके अनुरूप नहीं था, लेकिन बाद में किसी के लिए भी यह उपयोगी साबित हो सकता है।

मेरे मामले में, मैं apt-cacher-ngएक dockerनिर्माण से एक स्थानीय सेवा की उपलब्धता के लिए परीक्षण करना चाहता हूं । इसका मतलब है कि परीक्षण से पहले बिल्कुल कुछ भी स्थापित नहीं किया जा सकता है। कोई nc, nmap, expect, telnetया pythonperlहालांकि, मुख्य पुस्तकालयों के साथ मौजूद है, इसलिए मैंने इसका इस्तेमाल किया:

perl -MIO::Socket::INET -e 'exit(! defined( IO::Socket::INET->new("172.17.42.1:3142")))'

6

कुछ मामलों में जहां कर्ल, टेलनेट, एनसी ओ नैंप जैसे उपकरण अनुपलब्ध हैं, आपके पास अभी भी एक मौका है

if [[ $(wget -q -t 1 --spider --dns-timeout 3 --connect-timeout 10  host:port; echo $?) -eq 0 ]]; then echo "OK"; else echo "FAIL"; fi

6

बैश का उपयोग कर बंदरगाहों की जाँच करें

उदाहरण

$ ./test_port_bash.sh 192.168.7.7 22

पोर्ट 22 खुला है

कोड

HOST=$1
PORT=$2
exec 3> /dev/tcp/${HOST}/${PORT}
if [ $? -eq 0 ];then echo "the port $2 is open";else echo "the port $2 is closed";fi

4

यदि आप उपयोग करना चाहते हैं, ncलेकिन एक संस्करण नहीं है जो समर्थन करता है -z, तो उपयोग करने का प्रयास करें --send-only:

nc --send-only <IP> <PORT> </dev/null

और टाइमआउट के साथ:

nc -w 1 --send-only <IP> <PORT> </dev/null

और DNS लुकअप के बिना अगर यह एक आईपी है:

nc -n -w 1 --send-only <IP> <PORT> </dev/null

यह कोड को इस -zआधार पर लौटाता है कि यह कनेक्ट हो सकता है या नहीं।


1

मुझे लगता है कि यह एक उत्तर के लिए बहुत देर हो चुकी है, और यह एक अच्छा नहीं हो सकता है, लेकिन यहां आप जाते हैं ...

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

TIME = 'date +%s' + 15
while TIME != `date +%s'
do whatever

और फिर बस लूप में एक ध्वज जोड़ें, ताकि यदि यह पूरा होने से पहले बाहर निकल जाए, तो आप असफलता के कारण के रूप में टाइमआउट का हवाला दे सकते हैं।

मुझे संदेह है कि टेलनेट के पास टाइमआउट स्विच भी है, लेकिन मेरे सिर के ऊपर से बस, मुझे लगता है कि ऊपर काम करेगा।


1

मुझे लघु स्क्रिप्ट की आवश्यकता थी जो क्रोन में चलाई गई थी और आउटपुट नहीं थी। मैं अपनी समस्या को nmap का उपयोग करके हल करता हूं

open=`nmap -p $PORT $SERVER | grep "$PORT" | grep open`
if [ -z "$open" ]; then
  echo "Connection to $SERVER on port $PORT failed"
  exit 1
else
  echo "Connection to $SERVER on port $PORT succeeded"
  exit 0
fi

इसे चलाने के लिए आपको नैप स्थापित करना चाहिए क्योंकि यह डिफ़ॉल्ट रूप से स्थापित पैकेज नहीं है।


nmap's grepable' आउटपुट भी स्टैडआउट में -oG -भेजने के लिए उपयोगी हो सकता है । (grep को थोड़ा संशोधन की आवश्यकता होगी)
Gert van den Berg

0

यह पर्दे के पीछे टेलनेट का उपयोग करता है, और मैक / लिनक्स पर ठीक काम करता है। यह लिनक्स / मैक पर संस्करणों के बीच अंतर के कारण नेटकाट का उपयोग नहीं करता है, और यह डिफ़ॉल्ट मैक इंस्टॉल के साथ काम करता है।

उदाहरण:

$ is_port_open.sh 80 google.com
OPEN

$ is_port_open.sh 8080 google.com
CLOSED

is_port_open.sh

PORT=$1
HOST=$2
TIMEOUT_IN_SEC=${3:-1}
VALUE_IF_OPEN=${4:-"OPEN"}
VALUE_IF_CLOSED=${5:-"CLOSED"}

function eztern()
{
  if [ "$1" == "$2" ]
  then
    echo $3
  else
    echo $4
  fi
}

# cross platform timeout util to support mac mostly
# https://gist.github.com/jaytaylor/6527607
function eztimeout() { perl -e 'alarm shift; exec @ARGV' "$@"; }

function testPort()
{
  OPTS=""

  # find out if port is open using telnet
  # by saving telnet output to temporary file
  # and looking for "Escape character" response
  # from telnet
  FILENAME="/tmp/__port_check_$(uuidgen)"
  RESULT=$(eztimeout $TIMEOUT_IN_SEC telnet $HOST $PORT &> $FILENAME; cat $FILENAME | tail -n1)
  rm -f $FILENAME;
  SUCCESS=$(eztern "$RESULT" "Escape character is '^]'." "$VALUE_IF_OPEN" "$VALUE_IF_CLOSED")

  echo "$SUCCESS"
}

testPort 

0

सबसे अधिक वोट दिए गए उत्तर पर निर्माण, यहां दो बंदरगाहों के खुलने की प्रतीक्षा करने का एक कार्य है, साथ ही साथ टाइमआउट भी। उन दो बंदरगाहों पर ध्यान दें, जो खुले हुए हैं, 8890 और 1111, साथ ही साथ max_attempts (1 प्रति सेकंड)।

function wait_for_server_to_boot()
{
    echo "Waiting for server to boot up..."
    attempts=0
    max_attempts=30
    while ( nc 127.0.0.1 8890 < /dev/null || nc 127.0.0.1 1111 < /dev/null )  && [[ $attempts < $max_attempts ]] ; do
        attempts=$((attempts+1))
        sleep 1;
        echo "waiting... (${attempts}/${max_attempts})"
    done
}

-1

स्थानीय पोर्ट के परीक्षण के लिए nmap-ncat जो पहले से उपयोग में नहीं है


availabletobindon() {
  port="$1"
  nc -w 2 -i 1 localhost "$port" 2>&1 | grep -v -q 'Idle timeout expired'
  return "$?"
}

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