写点什么

python 版局域网端口扫描

作者:技能实验室
  • 2022-10-19
    河南
  • 本文字数:1120 字

    阅读完需:约 1 分钟

使用 python 实现一个局域网端口扫描器,需要用到库是:

> import ipaddress

import socket

import threading

import os

os 是内置库,主要用于执行命令

threading 是一个多线程库,用于加快执行速度,是 python 第三方库,需要自己安装;

socket 是 python 内置库,用于链接端口,通过是否可以链接端口判断端口是否开放

ipaddress 是一个 ip 地址库,用于实例化 ip 对象给到 socket,第三方库,需要安装

安装 threading 和 ipaddress 推送使用 pip 方式,相对来说比较简单:

> 打开命令行窗口;

> 分别执行以下代码:

> pip install ipaddress

> pip install threading

> 等待安装成功

两个库的安装都比较简单,不依赖与其他库,直接安装即可;

**代码实现**

实现逻辑:

python 局域网端口扫描器

1. 通过执行 ping 命令获取指定网段的可用 ip

2. 通过 socket 链接扫描可用 ip 的端口

3. 使用 threading 进行多线程任务

**获取可用 ip**

```python

live_ips = []

# ip 是否能 ping 通

def ping_ip(ip_str):

cmd = ["ping", "-n","1", ip_str]

output = os.popen(" ".join(cmd)).readlines()

for line in output:

if str(line).upper().find("TTL") >= 0:

print("ip: %s is ok ***" % ip_str)

live_ips.append(ip_str)

break

def find_ip(ip_prefix):

'''''

给出当前的 192.168.0 ,然后扫描整个段所有地址

'''

threads = []

for i in range(1, 256):

ip = '%s.%s' % (ip_prefix, i)

threads.append(threading.Thread(target=ping_ip, args={ip, }))

for i in threads:

i.start()

for i in threads:

i.join()

find_ip('192.168.0')

print(live_ips)

```

枚举指定网段的所有 ip 地址,通过 ping 命令测试是否是可以 ip;

**扫描端口**

```

port_start = 0

port_end = 100 #65535

def scan(ip_str):

print(ip_str)

ip = ipaddress.ip_address(ip_str)

ports = []

for port in range(port_start,port_end):

try:

with socket.socket(socket.AF_INET,socket.SOCK_STREAM) as s:

s.settimeout(0.5)

s.connect(ip,port)

ports.append(":".join(ip_str,port))

except:

print(str(port)+'端口不通')

pass

return ports

```

通过 socket 的实例化对象的 connect 方法,传入 ip 和端口,测试是否有返回;

最后通过多线程方法调用;

```

def scan_port():

threads = []

for live_ip in live_ips:

threads.append(threading.Thread(target=scan,args={live_ip,}))

for i in threads:

i.start()

for i in threads:

i.join()

print('执行结束...')

```

相比于单线程,多线程的速度明显更快;

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-07-26 加入

还未添加个人简介

评论

发布
暂无评论
python版局域网端口扫描_Python_技能实验室_InfoQ写作社区