2010-06-07 13 views
17

मैं उन बंदरगाहों को कैसे प्राप्त करूं जो पाइथन का उपयोग करने पर एक प्रक्रिया सुन रही हैं? प्रक्रिया का ढक्कन ज्ञात है।बंदरगाहों को कैसे प्राप्त किया जा सकता है जो सुनने में एक प्रक्रिया है?

उत्तर

1

आप netstat -lnp का उपयोग कर सकते हैं, अंतिम कॉलम में पिड और प्रक्रिया का नाम होगा। पायथन में आप इस कमांड के आउटपुट को पार्स कर सकते हैं।

4

यदि आप netstat या lsof जैसे किसी प्रोग्राम के आउटपुट को पार्स नहीं करना चाहते हैं, तो आप/proc फाइल सिस्टम के माध्यम से grovel कर सकते हैं और फ़ाइलों में दस्तावेज़ों को खोजने का प्रयास कर सकते हैं। /proc/<pid>/net/tcp आपके लिए विशेष रूप से दिलचस्प हो सकता है। बेशक, उन फ़ाइलों का प्रारूप कर्नेल रिलीज़ के बीच बदल सकता है, इसलिए पार्सिंग कमांड आउटपुट को आम तौर पर अधिक विश्वसनीय माना जाता है।

21

दो मेरा उत्तर करने के लिए भागों के होते हैं:

1. खोल

पहले भाग के लिए, netstat काम करेगा में जानकारी प्राप्त हो रही है, लेकिन मैं lsof का उपयोग कर पसंद करते हैं, के बाद से यह प्रयोग किया जा सकता अधिक जानकारीपूर्ण और संक्षिप्त सूची निकालने के लिए। सटीक विकल्प आपके ओएस, गिरी और संकलन विकल्पों के आधार पर भिन्न हो सकते हैं उपयोग करने के लिए है, लेकिन मेरा मानना ​​है कि आप कुछ इस तरह हैं:

lsof -a -p23819 -i4 

कहाँ 23819 पीआईडी ​​आप के लिए चयन कर रहे हैं है, और i4 अर्थ है सभी आईपीवी 4 सॉकेट (हालांकि आप आईपीवी 6 के लिए i6 चाहते हैं, जैसा मामला हो सकता है)। वहां से, आप केवल सॉकेट सुनने के लिए grep के माध्यम से पाइप कर सकते हैं।

lsof -a -p23819 -i4 | grep LISTEN 

(lsof संस्करण 4.82 में, आप अतिरिक्त -sTCP:LISTEN झंडा grep के बजाय सुन सॉकेट चयन करने के लिए उपयोग कर सकते हैं, हालांकि इस विकल्प संस्करण 4.78 में वापस उपलब्ध हो प्रतीत नहीं होता है)

2।

012,351,641: अजगर से

आप lsof कॉल करने के लिए और उत्पादन को पढ़ने, अजगर से, subprocess मॉड्यूल का उपयोग कर, तो तरह सक्षम होना चाहिए lsof कॉलिंग

from subprocess import Popen, PIPE 
p1 = Popen(['lsof', '-a', '-p23819', '-i4'], stdout=PIPE) 
p2 = Popen(["grep", "LISTEN"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

आशा है कि इससे मदद मिलती है!

15

आप psutil उपयोग कर सकते हैं:

>>> import psutil 
>>> p = psutil.Process(2549) 
>>> p.name() 
'proftpd: (accepting connections)' 
>>> p.connections() 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 

... सॉकेट सुनने के लिए फ़िल्टर करने के लिए:

>>> [x for x in p.get_connections() if x.status == psutil.CONN_LISTEN] 
[connection(fd=1, family=10, type=1, local_address=('::', 21), remote_address=(), status='LISTEN')] 
>>> 
+0

धन्यवाद। psutil एक अच्छा मॉड्यूल है। लेकिन एकमात्र समस्या यह है कि मॉड्यूल का उपयोग करने से पहले इसे स्थापित करने की आवश्यकता है। और psutil स्थापित करने के लिए जीसीसी और पायथन हेडर स्थापित करने की जरूरत है। तो psutil का उपयोग कर परियोजना स्थापित करना मुश्किल होगा। – mtoloo

+0

psutil को gcc की आवश्यकता है क्योंकि इसमें सी कोड शामिल है जिसे संकलित करने की आवश्यकता है। मैं कहता हूं कि यह स्थापित करना मुश्किल नहीं है, खासकर लिनक्स पर। उबंटू पर, उदाहरण के लिए, आपको बस "पायथन-देव इंस्टॉल करें" और "पीआईपी स्थापित psutil" की आवश्यकता है और आप कर चुके हैं। –

0

एक बात है कि उल्लेख नहीं किया गया था। पायथन में अधिकांश बंदरगाह अनुप्रयोग कमांड लाइन तर्क लेते हैं। आप पार्स/proc/pid/cmdline पार्स कर सकते हैं और पोर्ट नंबर को पार्स कर सकते हैं। यह कनेक्शन के टन के साथ सर्वर पर एसएस या नेटस्टैट का उपयोग करने के बड़े ओवरहेड से बचाता है।

संबंधित मुद्दे

 संबंधित मुद्दे