python 版局域网端口扫描
使用 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('执行结束...')
```
相比于单线程,多线程的速度明显更快;
版权声明: 本文为 InfoQ 作者【技能实验室】的原创文章。
原文链接:【http://xie.infoq.cn/article/4dcece968246986d0a5ffedd9】。文章转载请联系作者。
评论