20

Pythonスクリプトを使用して、Linuxマシンの特定のポート番号ですべての発信接続にアクセス/解析する必要があります。最も単純な実装は、netstat のサブプロセスを開き、その stdout を解析することです。

誰かが以前にこの問題を抱えていたと思いますが、オンラインで netstat パーサーが見つからないことに驚いています。これは、人々が共有する必要性を感じるほど大きな問題ではないのでしょうか?

4

1 に答える 1

37

特定のプロセスによって開かれた接続を制御する場合は、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)
 ...]
于 2011-06-05T16:37:27.503 に答える