यदि लिनक्स पर कोई पोर्ट खुला है तो कुशलतापूर्वक परीक्षण करें?


197

एक बैश स्क्रिप्ट से मैं कैसे जल्दी से पता लगा सकता हूं कि क्या 445एक सर्वर पर एक पोर्ट खुला / सुनाई दे रहा है।

मैंने कुछ विकल्पों की कोशिश की है, लेकिन मैं कुछ जल्दी चाहता हूं:
1. lsof -i :445 (सेकंड लेता है)
2. netstat -an |grep 445 |grep LISTEN(लेता सेकंड)
3. telnet(यह वापस नहीं आता है)
4. nmap, netcatसर्वर पर उपलब्ध नहीं हैं

ऐसे तरीके के बारे में जानकर अच्छा लगेगा जो पहले नहीं जगाता और उसके बाद जीआरईपी।


1
नेटकैट उपलब्ध है? यह एक तेजी से विफल पथ IIRC है। netcat.sourceforge.net
JimR

5
netstat -lnt(साथ -tऔर बिना -a) केवल टीसीपी कनेक्शन सुनने के लिए आउटपुट को सीमित करेगा। इसमें थोड़ी तेजी आ सकती है। -4IPv4 के लिए आप तभी जोड़ सकते हैं जब आपको IPv6 की आवश्यकता न हो।
बार्टोज़ मोस्कुलस्की

lsof -i एक व्यक्तिगत पसंदीदा है।
मैट जॉयस

14
netstat -an | grep PORTNUMBER | grep -i listenयदि आउटपुट खाली है, तो पोर्ट उपयोग में नहीं है।
ऑटोमेटिक्स

मुझे नहीं पता कि lsofआपके लिए यह धीमा क्यों है, लेकिन आम तौर पर आपके द्वारा सूचीबद्ध समाधानों में यह सबसे अच्छा है। आपका netstatसमाधान बहुत विश्वसनीय नहीं है (जब भी आप इसका उपयोग कर सकते हैं grep, आप अनुमान लगा सकते हैं ; वैसे भी यह सच है अगर कोई उदाहरण के लिए 4450 पर सुन रहा है)। telnetऔर netcatवास्तव में एक कनेक्शन बनाने का प्रयास करते हैं, जो हमेशा वह नहीं हो सकता जो आप चाहते हैं।
पीटरसन

जवाबों:


155

एक आश्चर्य मुझे हाल ही में पता चला है कि बैश मूल रूप से फ़ाइल विवरणकों के रूप में टीसीपी कनेक्शन का समर्थन करता है । काम में लाना:

exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6

मैं फाइल डिस्क्रिप्टर के रूप में 6 का उपयोग कर रहा हूं क्योंकि 0,1,2 स्टड, स्टडआउट, और स्टेडर हैं। 5 को कभी-कभी बाल प्रक्रियाओं के लिए बैश द्वारा उपयोग किया जाता है , इसलिए 3,4,6,7,8, और 9 सुरक्षित होना चाहिए।

नीचे दी गई टिप्पणी के अनुसार, एक स्क्रिप्ट में एक स्थानीय सर्वर पर सुनने के लिए परीक्षण करने के लिए :

exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection

यह निर्धारित करने के लिए कि कोई सुन रहा है, लूपबैक द्वारा कनेक्ट करने का प्रयास। यदि यह विफल रहता है, तो पोर्ट बंद है या हमें एक्सेस की अनुमति नहीं है। बाद में, कनेक्शन बंद करें।

अपने उपयोग के मामले के लिए इसे संशोधित करें, जैसे कि एक ईमेल भेजना, स्क्रिप्ट को विफलता पर बाहर निकालना, या आवश्यक सेवा शुरू करना।


2
यह सिर्फ मेरे लिए लटका हुआ है।
अमन जैन

@AmanJain बिल्ली ईओएफ या Ctrl-C के निकलने का इंतजार करती है। आपको अपने प्रोटोकॉल के लिए इसे समायोजित करने की आवश्यकता होगी। BTW क्या आप इसे रिमोट सर्वर पर चला रहे हैं?
स्पेंसर रथबुन

मैं सर्वर पर एक स्क्रिप्ट में /etc/init.d/ के तहत पोर्ट चेकिंग कोड को एम्बेड करना चाहता हूं
अमन जैन

@AmanJain मैंने इसे एक स्थानीय प्रणाली के लिए अद्यतन किया है। क्या आप सही जाँच करना चाहते हैं कि यह सही है? कोई प्रोटोकॉल जाँच नहीं है, जैसे http के माध्यम से एक पेज का अनुरोध करना?
स्पेंसर रथबुन

1
यह एक विश्वसनीय तरीका नहीं है क्योंकि सभी ओएस नहीं हैं (जैसे ubuntu 16 जैसा कि मुझे आज पता चला) /dev/tcp/IP/PORTपेड़ बनाने के लिए संकलित किए गए बैश के साथ भेज दिया जाता है
dyasny

107

यहां "तेज़ उत्तर" के साथ बहुत ही कम है: शेल स्क्रिप्ट से दूरस्थ टीसीपी पोर्ट खोले जाने पर परीक्षण कैसे करें?

nc -z <host> <port>; echo $?

मैं इसे 127.0.0.1 "रिमोट" पते के साथ उपयोग करता हूं।

यदि पोर्ट बंद है और "1" यदि पोर्ट बंद है तो यह "0" देता है

जैसे

nc -z 127.0.0.1 80; echo $?

-z निर्दिष्ट करता है कि एनसी को केवल डेमॉन को सुनने के लिए स्कैन करना चाहिए, उन्हें कोई डेटा भेजे बिना। यह इस विकल्प का उपयोग करने में एक त्रुटि है -l विकल्प के साथ tion में।


2
यह सबसे आसान तरीका लगता है, धन्यवाद। नमूना स्क्रिप्ट लिंक अभी काम नहीं कर रहा है, फिर भी यह किसी भी तरह से काफी स्पष्ट है।
derFunk

अच्छा! यह सर्वर पर अन्य उत्तरों की तुलना में बहुत तेज है, जिसमें कई पोर्ट खुले हैं। मेरे लिए <0.01 सेकंड में रिटर्न करता है जबकि netstat / lsof 1s +
टिम

2
-Z ध्वज नैम्प आधारित एनसीएटी में उपलब्ध नहीं है जो सबसे हाल ही में डिस्ट्रो शिप के साथ है: फेडोरा, सेंटोस, आदि (nmap-ncat-6.01-9.fc18.x86_64)
Zack

9
काउंटर-सहजता से, यह "0" लौटाता है यदि पोर्ट खुला है और "1" यदि पोर्ट बंद है।
सीन

3
@ सीन यूनिक्स कमांड आमतौर पर विफलता के लिए सफलता और गैर-शून्य इंगित करने के लिए '0' लौटाते हैं। इसलिए '0' इंगित करता है कि यह सफलतापूर्वक जुड़ा हुआ है और गैर-शून्य है कि यह किसी कारण से कनेक्ट नहीं हुआ। ध्यान दें, हालांकि, 'nc' के कुछ संस्करण '-z' तर्क का समर्थन नहीं करते हैं इसलिए stackoverflow.com/a/25793128/6773916 यकीनन एक बेहतर समाधान है।
रिच सेडमैन

89

आप बहुत तेजी से परिणाम के लिए इस तरह netstat का उपयोग कर सकते हैं:

लिनक्स पर:

netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

मैक पर:

netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'

यह पोर्ट पर सुनने वाली प्रक्रियाओं की एक सूची (445 इस उदाहरण में) को आउटपुट करेगा या पोर्ट फ्री होने पर यह कुछ भी आउटपुट नहीं करेगा।


1
आपका netstat सिंटैक्स गलत है। netstat -ln --tcp काम करता है, लेकिन फिर भी धीमा है
अमन जैन

6
वास्तव में यह सही सिंटैक्स है लेकिन शायद आप लिनक्स का उपयोग कर रहे हैं और मैं मैक पर हूं। लिनक्स के लिए इसका उपयोग करें:netstat -lnt | awk '$6 == "LISTEN" && $4 ~ ".445"'
शुभ

21
यह कुछ भी नहीं उत्पादन किया।
जुरगेन पॉल

1
प्रश्न हालांकि लिनक्स के बारे में था, इसलिए शायद टिप्पणी उत्तर में होनी चाहिए।
UpTheCreek

1
पोर्ट 80 की जांच के लिए मुझे उपयोग करने की आवश्यकता थी awk '$6 == "LISTEN" && $4 ~ "80$"'। पोर्ट नंबर से पहले डॉट के लिए जाँच करने के बजाय \.80, मैंने उपयोग किया 80$। अन्यथा, यह भी आईपी पते से मेल खाता है .80और बंदरगाहों से शुरू होता है 80जैसे कि 8000
पैट्रिक ओसिटी

37

आप इसके लिए netcat का उपयोग कर सकते हैं।

nc ip port < /dev/null

सर्वर से कनेक्ट होता है और सीधे कनेक्शन को फिर से बंद कर देता है। यदि netcat कनेक्ट करने में सक्षम नहीं है, तो यह एक गैर-शून्य निकास कोड लौटाता है। निकास कोड को चर $ में संग्रहित किया जाता है। उदहारण के लिए,

nc ip port < /dev/null; echo $?

0 लौटाएगा अगर और केवल अगर netcat सफलतापूर्वक पोर्ट से जुड़ सकता है।


1
इस उत्तर को और अधिक बढ़ाने की जरूरत है। nc इस मामले के लिए पूरी तरह से काम करता है। / dev / tcp ट्रिक चतुर है, लेकिन सिग्नल इंटरप्ट के साथ स्क्रिप्ट को लागू करना मुश्किल लगता है।
अवींद्र गोलचरण

5
ncहै -zइस उद्देश्य है, जिसमें से इनपुट लेने की आवश्यकता नहीं है के लिए झंडा /dev/null-zऊपर के झंडे का उपयोग करने के लिए पहले से ही एक उत्तर है।
अबे वोल्कर

2
@AbeVoelker एनसी -z ध्वज के सभी संस्करणों का समर्थन नहीं करता है। मैं CentOS 7 पर हूं और टोनी का समाधान मुझे वही चाहिए जो मुझे चाहिए।
Shadoninja

@ शादोनिन्जा को जानकर अच्छा लगा! अगर मैं 2014 की अपनी टिप्पणी से फ़्लिप्टेंट-नेस को संपादित कर सकता था।
अबे वोल्कर

'nc' अब '-z' का समर्थन नहीं करता है और इसलिए यह उत्तर सबसे अच्छा समाधान है।
रिच सेडमन

18

स्पेन्सर रथबुन के जवाब के आधार पर, बैश का उपयोग करते हुए:

true &>/dev/null </dev/tcp/127.0.0.1/$PORT && echo open || echo closed

अच्छा है, यह "कनेक्शन अस्वीकृत" संदेश को दबा देगा। यदि सेवा हमेशा के लिए प्रतीक्षा किए बिना कनेक्शन स्वीकार कर लेती है तो स्वतः बाहर निकल जाती है।
सेफ़

सेवाओं के लिए सबसे अच्छा समाधान जो एक नए कनेक्शन के बाद कोई डेटा नहीं भेजते हैं। Netcat पर कॉल करने से लगभग 20 गुना तेज। को छोटा किया जा सकता: &>/dev/null </dev/tcp/127.0.0.1/$PORT
ens

16

वे / proc / net / tcp में सूचीबद्ध हैं।

यह हेक्स में ":" के बाद दूसरा कॉलम है:

> cat /proc/net/tcp
  sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                                                     
   0: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 10863 1 ffff88020c785400 99 0 0 10 -1                     
   1: 0100007F:0277 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 7983 1 ffff88020eb7b3c0 99 0 0 10 -1                      
   2: 0500010A:948F 0900010A:2328 01 00000000:00000000 02:00000576 00000000  1000        0 10562454 2 ffff88010040f7c0 22 3 30 5 3                   
   3: 0500010A:E077 5F2F7D4A:0050 01 00000000:00000000 02:00000176 00000000  1000        0 10701021 2 ffff880100474080 41 3 22 10 -1                 
   4: 0500010A:8773 16EC97D1:0050 01 00000000:00000000 02:00000BDC 00000000  1000        0 10700849 2 ffff880104335440 57 3 18 10 -1                 
   5: 0500010A:8772 16EC97D1:0050 01 00000000:00000000 02:00000BF5 00000000  1000        0 10698952 2 ffff88010040e440 46 3 0 10 -1                  
   6: 0500010A:DD2C 0900010A:0016 01 00000000:00000000 02:0006E764 00000000  1000        0 9562907 2 ffff880104334740 22 3 30 5 4                    
   7: 0500010A:AAA4 6A717D4A:0050 08 00000000:00000001 02:00000929 00000000  1000        0 10696677 2 ffff880106cc77c0 45 3 0 10 -1  

इसलिए मुझे लगता :50है कि तीसरे स्तंभ में से एक स्टैकओवरफ़्लो होना चाहिए: ओ)

में देखने के लिए man 5 procअधिक जानकारी के लिए। और इसके अलावा पालक आदि को छोड़कर कोमल पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है ...


10
ss -tl4 '( sport = :22 )'

2ms काफी जल्दी है?

कोलन को जोड़ें और यह लिनक्स पर काम करता है


2
महान एक, ssकी तुलना में भी तेज है nclके लिए है सुन , 4आईपीवी 4 के लिए है; sport(बेशक) स्रोत बंदरगाह के लिए खड़ा है । उपरोक्त कमांड एक श्रवण टीसीपी पोर्ट ( tविकल्प) मान रहा है : uयूडीपी के लिए विकल्प का उपयोग करें , या दोनों प्रोटोकॉल के लिए उनमें से कोई भी नहीं। Nixcraftss पर हमेशा की तरह अधिक जानकारी । नोट: फ़िल्टर यहाँ काम नहीं कर रहे हैं, पता नहीं क्यों (4.3.11 bash, ss यूटिलिटी, iproute2-ss131122), grep के साथ जाना है । ss
कैम्पा

बहुत बुरा है कि ssकमांड अपने खोज को दर्शाते हुए एक निकास कोड वापस नहीं करता है; यह हमेशा 0 निकास कोड देता है।
जॉन ग्रीन

| grep LISTEN?
ल्यूकोस

मैं State Recv-Q Send-Q Local Address:Port Peer Address:Portऔर अब? इसका क्या मतलब है?
ब्लैक


6
nc -l 8000

जहां 8000 पोर्ट नंबर है। यदि पोर्ट मुफ्त है, तो यह एक सर्वर शुरू करेगा जिसे आप आसानी से बंद कर सकते हैं। यदि यह नहीं है तो यह एक त्रुटि फेंक देगा:

nc: Address already in use

5

मैं यह जांचना चाहता था कि हमारे लिनक्स टेस्ट सर्वर में से एक पोर्ट खुला है या नहीं। मैं अपने देव मशीन से टेस्ट सर्वर से टेलनेट से जुड़ने की कोशिश कर रहा था। आप पर देव मशीन चलाने की कोशिश करें:

$ telnet test2.host.com 8080
Trying 05.066.137.184...
Connected to test2.host.com

इस उदाहरण में, मैं यह जांचना चाहता हूं कि पोर्ट 8080 होस्ट test2.host.com पर खुला है या नहीं


1

tcping बहुत कम ओवरहेड के साथ एक महान उपकरण है। इसे जल्दी बनाने के लिए एक टाइमआउट तर्क भी है:

[root@centos_f831dfb3 ~]# tcping 10.86.151.175 22 -t 1
10.86.151.175 port 22 open.
[root@centos_f831dfb3 ~]# tcping 10.86.150.194 22 -t 1
10.86.150.194 port 22 user timeout.
[root@centos_f831dfb3 ~]# tcping 1.1.1.1 22 -t 1
1.1.1.1 port 22 closed.

1
यकीन नहीं है कि स्पैन्सर के समाधान के लिए कोई अतिरिक्त इंस्टॉल की आवश्यकता नहीं है, लेकिन यह सबसे साफ और सबसे अधिक मानव-रीडिंग समाधान है।
bdombro

1

आप netcat कमांड का भी उपयोग कर सकते हैं

[location of netcat]/netcat -zv [ip] [port]

या

nc -zv [ip] [port]

-z - वास्तव में उन्हें कोई डेटा भेजने के बिना, डेमॉन सुनने के लिए स्कैन करने के लिए एनसी सेट करता है।
-v - वर्बोज़ मोड को सक्षम करता है।


-2

nmapसही उपकरण है। बस उपयोग करेंnmap example.com -p 80

आप इसे स्थानीय या दूरस्थ सर्वर से उपयोग कर सकते हैं। यदि फ़ायरवॉल पहुँच को रोक रहा है, तो यह आपको पहचानने में भी मदद करता है।


-4

यदि आप iptables आज़मा रहे हैं:

iptables -nL

या

iptables -nL | grep 445

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