使用Python统计端口TCP连接数

简介:

  此脚本可以用来统计某个端口上连接的IP的数量,统计连接到这一端口的所有IP、最多的IP和次数以及TCP连接状态。

    涉及到Python读取网络连接统计信息以及统计计算的一些基本操作。在编写脚本的过程中预先定义了统计信息的数据结构,在向最终结果中添加统计信息时需要用到list去重功能,因此临时创建了一个列表使用set()函数去重。set()函数不能直接add字典类型,因此先将字典转成可哈希的字符串,再将去重后的字符串转成字典。其中字典、列表和集合都属于不可哈希的类型。

    此脚本可以用于Windows、Linux以及OSX,其中OSX上运行需要使用root权限(由于psutil的原因),使用时直接使用python运行此脚本文件即可。如果提示‘ImportError’,则使用pip安装所缺的模块,非特权用户使用pip安装模块时需要使用sudo。

    脚本内已经设定port为22,可以自己修改代码,使它允许成接收命令行位置参数或者手动输入。

运行效果图如下:

1.使用root用户运行

image 

2.使用非特权用户运行

image

脚本文件可以通过GitHub获取:https://github.com/DingGuodong/LinuxBashShellScriptForOps/blob/master/functions/net/tcp/port/portStatistics.py

脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/python
# encoding: utf-8
# -*- coding: utf8 -*-
"""
Created by PyCharm.
File:               LinuxBashShellScriptForOps:portStatistics.py
User:               Guodong
Create Date:        2016/10/27
Create Time:        10:51
 
Note:
     Usage:
     Using user as you want in Linux/Windows system.
     The python module 'psutil' and 'prettytable' is required, using pip
     install them.
     ```
     pip install psutil prettytable
     ```
     On OSX this function requires root privileges.
 
     # python portStatistics.py
     Total connections of port 22 is 10.
     +--------------+-------------------+-------------------+-----------------+--------------+
     | Total Counts | Remote IP Address | Established Conns | Time_wait Conns | Others Conns |
     +--------------+-------------------+-------------------+-----------------+--------------+
     |      5       |     10.6.28.46    |         5         |        0        |      0       |
     |      1       |     10.6.28.35    |         1         |        0        |      0       |
     |      1       |     10.6.28.27    |         1         |        0        |      0       |
     |      2       |    10.6.28.135    |         2         |        0        |      0       |
     |      1       |    10.6.28.125    |         1         |        0        |      0       |
     +--------------+-------------------+-------------------+-----------------+--------------+
     Elapsed time: 0.0104579925537 seconds.
     #
 
  """
 
import  psutil
import  prettytable
import  time
 
startTime  =  time.time()
 
port  =  22   # ssh -i /etc/ssh/ssh_host_rsa_key root@10.6.28.28
 
# define data structure for each connection, each ip is unique unit
ipaddress  =  {
     'ipaddress' None ,
     'counts' 0 ,
     'stat' : {
         'established' 0 ,
         'time_wait' 0 ,
         'others' 0
     }
}
 
# define data structure for statistics
statistics  =  {
     'portIsUsed' False ,
     'portUsedCounts' 0 ,
     'portPeerList' : [
         {
             'ipaddress' None ,
             'counts' 0 ,
             'stat' : {
                 'established' 0 ,
                 'time_wait' 0 ,
                 'others' 0
             },
         },
     ]
}
 
tmp_portPeerList  =  list ()
portPeerSet  =  set ()
netstat  =  psutil.net_connections()
 
# get all ip address only for statistics data
for  i, sconn  in  enumerate (netstat):
 
     if  port  in  sconn.laddr:
         statistics[ 'portIsUsed' =  True
         if  len (sconn.raddr) ! =  0 :
             statistics[ 'portUsedCounts' + =  1
             ipaddress[ 'ipaddress' =  sconn.raddr[ 0 ]
             tmp_portPeerList.append( str (ipaddress))   # dict() list() set() is unhashable type, collections.Counter
 
for  ip  in  tmp_portPeerList:
     portPeerSet.add( str (ip))   # remove duplicated ip address using set()
 
for  member  in  portPeerSet:
     statistics[ 'portPeerList' ].append( eval (member))
 
# add statistics data for each ip address
for  sconn  in  netstat:
     if  port  in  sconn.laddr:
         if  len (sconn.raddr) ! =  0 :
             for  i, item  in  enumerate (statistics[ 'portPeerList' ]):
                 if  item[ 'ipaddress' = =  sconn.raddr[ 0 ]:
                     statistics[ 'portPeerList' ][i][ 'counts' + =  1
                     if  sconn.status  = =  'ESTABLISHED' :
                         statistics[ 'portPeerList' ][i][ 'stat' ][ 'established' + =  1
                     elif  sconn.status  = =  'TIME_WAIT' :
                         statistics[ 'portPeerList' ][i][ 'stat' ][ 'time_wait' + =  1
                     else :
                         statistics[ 'portPeerList' ][i][ 'stat' ][ 'others' + =  1
 
# print statistics result using prettytable
if  statistics[ 'portIsUsed' ]:
     print  "Total connections of port %s is %d."  %  (port, statistics[ 'portUsedCounts' ])
     table  =  prettytable.PrettyTable()
     table.field_names  =  [ "Total Counts" "Remote IP Address" "Established Conns" "Time_wait Conns" ,
                          "Others Conns" ]
     for  i, ip  in  enumerate (statistics[ 'portPeerList' ]):
         if  ip[ 'ipaddress' is  not  None :
             table.add_row([ip[ 'counts' ], ip[ 'ipaddress' ], ip[ 'stat' ][ 'established' ], ip[ 'stat' ][ 'time_wait' ],
                            ip[ 'stat' ][ 'others' ]])
     print  table.get_string(sortby = table.field_names[ 1 ], reversesort = True )
else :
     print  'port %s has no connections, please make sure port is listen or in use.'  %  port
 
endTime  =  time.time()
print  "Elapsed time: %s seconds."  %  (endTime  -  startTime)

tag:端口统计,python TCP连接数统计,Python统计连接数

--end--




本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1866690,如需转载请自行联系原作者


相关文章
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
128 68
|
4月前
|
NoSQL Unix 网络安全
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
【Azure Cache for Redis】Python Django-Redis连接Azure Redis服务遇上(104, 'Connection reset by peer')
|
2月前
|
数据可视化 数据挖掘 Python
Seaborn 库创建吸引人的统计图表
【10月更文挑战第11天】本文介绍了如何使用 Seaborn 库创建多种统计图表,包括散点图、箱线图、直方图、线性回归图、热力图等。通过具体示例和代码,展示了 Seaborn 在数据可视化中的强大功能和灵活性,帮助读者更好地理解和应用这一工具。
45 3
|
2月前
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
372 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
2月前
|
JSON 数据格式 Python
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
这篇文章介绍了一个Python脚本,用于统计TXT或JSON文件中特定单词的出现次数。它包含两个函数,分别处理文本和JSON文件,并通过命令行参数接收文件路径、目标单词和文件格式。文章还提供了代码逻辑的解释和示例用法。
50 0
Python实用记录(十四):python统计某个单词在TXT/JSON文件中出现的次数
|
1月前
|
测试技术 API 数据安全/隐私保护
Python连接到Jira实例、登录、查询、修改和创建bug
通过使用Python和Jira的REST API,可以方便地连接到Jira实例并进行各种操作,包括查询、修改和创建Bug。`jira`库提供了简洁的接口,使得这些操作变得简单易行。无论是自动化测试还是开发工作流的集成,这些方法都可以极大地提高效率和准确性。希望通过本文的介绍,您能够更好地理解和应用这些技术。
99 0
|
2月前
|
XML JSON 网络协议
【TCP/IP】自定义应用层协议,常见端口号
【TCP/IP】自定义应用层协议,常见端口号
34 3
|
2月前
|
Python
Python编程--使用NMAP端口扫描
Python编程--使用NMAP端口扫描
27 1
|
2月前
|
网络安全 Python
Python编程--目标IP地址段主机指定端口状态扫描
Python编程--目标IP地址段主机指定端口状态扫描
58 1
|
3月前
|
Linux Python
用python扫描linux开放的端口(3种方式)
这篇文章介绍了三种使用Python实现Linux端口扫描的方法,包括基础版端口扫描、全端口扫描和多线程扫描技术。
64 15