python编写端口扫描器_端口扫描器编写 python

本文介绍如何使用Python编写一个端口扫描器,通过连接目标主机的端口判断其是否开放。通过优化代码,包括设置超时时间和采用多线程,能显著提升扫描效率,大约7秒内完成1到65535端口的扫描。
摘要由CSDN通过智能技术生成

今天来编写一个 端口扫描器, 扫描某个主机 ,开放的端口

原理

对某个端口进行 socket 连接, 如果连接成功, 则代表 该端口有效,

可以根据端口,判断 是 哪个服务, 很多情况下,都是很准确的。

80 http

443 https

22 ssh

23 telnet

59 dns

3389 microsoft rdp

一共有 1-65535 个端口(其实0也可以用)

简单代码

# coding = utf-8

import socket

socket.setdefaulttimeout(0.1)

def get_port(host, port):

try:

obj = socket.socket()

obj.connect((host,port))

return True

except:

return False

def port_scan_test():

if get_port('127.0.0.1',135):

print('open!!!')

else:

print("No No No!!!")

代码优化

对代码进行优化, 刚才的代码,运行的时间非常慢,还只是在扫描一个端口的情况下

如果扫描一个 不存在的端口的时候, 会超时, 可以把 超时时间 设置短一点

对代码进行 多线程 或者 多进程的优化 ,大大缩短 扫描所有端口的时间

最后的代码

# coding = utf-8

import socket

import queue

socket.setdefaulttimeout(0.1)

import threading

def get_port(host, port):

try:

obj = socket.socket()

obj.connect((host,port))

return True

except:

return False

class mutit_scan(threading.Thread):

def __init__(self, host, port_queue):

threading.Thread.__init__(self)

self.port_queue = port_queue

self.host = host

def run(self):

while not self.port_queue.empty():

port = self.port_queue.get()

self.get_port_sign(port)

def get_port_sign(self, port):

# print(port)

if get_port(self.host, port):

print(port, 'is open!!!')

def mutili_port_scan_all():

""" 多线程优化 """

ip = '60.172.40.204'

thread_count = 500

threads = []

port_que = queue.Queue()

port_list = []

for i in range(1,65536):

port_list.append(i)

port_que.put(i)

for _ in range(thread_count):

thread = mutit_scan(ip, port_que)

threads.append(thread)

thread.start()

for i in threads:

i.join()

mutili_port_scan_all()

9ae2836143c9031f80739ebcf15c725e.png

差不多 7 秒跑完, 那个 socket 超时时间可以设置成 0.01s

记录一下, 写这个东西的思路, 虽然很简单,但是千里之行始于足下嘛

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值