2010-10-22 60 views
7

我想要使用Python腳本訪問/解析Linux機器上特定端口號上的所有傳出連接。最簡單的實現似乎是爲netstat打開一個子進程並解析它的stdout。如何訪問Python中的netstat數據?

我想象之前有人遇到過這個問題,並且很驚訝沒有在網上找到任何netstat解析器。這對於人們感到需要分享的問題來說還不夠大嗎?

回答

1

除了解析netstat的輸出外,還可以查看每個進程的/ proc條目以查看打開的套接字。有一個相當簡單的perl script that does this,你可以翻譯成python。

17

如果你想控制的連接通過一定的程序打開您可以使用psutil:

>>> p = psutil.Process(1694) 
>>> p.name() 
'firefox' 
>>> p.connections() 
[connection(fd=115, family=2, type=1, local_address=('10.0.0.1', 48776), remote_address=('93.186.135.91', 80), status='ESTABLISHED'), 
connection(fd=117, family=2, type=1, local_address=('10.0.0.1', 43761), remote_address=('72.14.234.100', 80), status='CLOSING'), 
connection(fd=119, family=2, type=1, local_address=('10.0.0.1', 60759), remote_address=('72.14.234.104', 80), status='ESTABLISHED'), 
connection(fd=123, family=2, type=1, local_address=('10.0.0.1', 51314), remote_address=('72.14.234.83', 443), status='SYN_SENT')] 

內部psutil使用的/ proc。 如果您對系統級特定端口號的連接感興趣,則可以查看psutil如何實現它。

編輯:從psutil 2.1.0開始,你也可以使用net_connections()收集全系統的連接

>>> import psutil 
>>> psutil.net_connections() 
[pconn(fd=115, family=2, type=1, laddr=('10.0.0.1', 48776), raddr=('93.186.135.91', 80), status='ESTABLISHED', pid=1254), 
pconn(fd=117, family=2, type=1, laddr=('10.0.0.1', 43761), raddr=('72.14.234.100', 80), status='CLOSING', pid=2987), 
pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 60759), raddr=('72.14.234.104', 80), status='ESTABLISHED', pid=None), 
pconn(fd=-1, family=2, type=1, laddr=('10.0.0.1', 51314), raddr=('72.14.234.83', 443), status='SYN_SENT', pid=None) 
...] 
+0

psutil真的很棒!我已經開始最近使用它,它是一個救星!榮譽給作者! – fccoelho 2012-05-08 12:15:22

+0

很高興你喜歡它 – 2013-06-09 23:25:15

+1

更新:新的2.1.0版本能夠列出全系統套接字連接: http://grodola.blogspot.com/2014/04/reimplementing-netstat-in-cpython.html – 2014-04-08 22:55:55