Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I access netstat data in Python?

Tags:

I'm trying to need to access/parse all outgoing connections on a particular port number on a Linux machine using a Python script. The simplest implementation seems to be to open a subprocess for netstat and parse its stdout.

I imagine someone somewhere has had this problem before, and am surprised not to find any netstat parsers online. Is this just not big enough of a problem for people to feel the need to share?

like image 937
Andrey Fedorov Avatar asked Oct 22 '10 03:10

Andrey Fedorov


People also ask

How do I run a netstat command in Python?

Are you running it on Windows? If yes, try: p = Popen(['runas', '/noprofile', '/user:Administrator', 'netstat','nb'],stdin=PIPE, stdout= PIPE) p. stdin. write('password') stdout, stderr = p.

What is netstat listening?

It means that a program or service has bound to that port and is listening for incoming traffic.

What is netstat grep?

Typically, Netstat displays all the ports in use by all processes, however, by adding the grep command, you can limit those results to only a specific designated port. For example, if you wish to see which service is running on port 80, you just need to execute the following command: netstat -ant | grep 80.


1 Answers

If you want to control the connection opened by a certain process you can use 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')]

Internally psutil uses /proc. If you're interested in connections to/from a particular port number at system level you might take a look at how psutil implements it.

Edit: starting from psutil 2.1.0 you can also gather system-wide connections using 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)
 ...]
like image 94
Giampaolo Rodolà Avatar answered Sep 20 '22 15:09

Giampaolo Rodolà