简单端口扫描和目录扫描的Python脚本(添加线程池)需要记的点

一、以下是一个简单的portScan代码

import socket
import time
import threadpool
def scan(port):
    socket.setdefaulttimeout(3)
    _port = int(port)
    try:
        s=socket.socket()
        _s=s.connect((ips,_port))
        if _s==None:
            print ('this port:%s is on' % _port)
            s.close()
    except Exception as e:
        new_port=str(_port)
        print(new_port+'端口出现下述问题,无法连接')
        print(e)

if __name__ == '__main__':
    wangzhi = input('input wangzhi:')
    ips = socket.gethostbyname(wangzhi)
    print('ip: %s' % ips)
    with open('port.txt', 'r') as f:
        portlist = f.readlines()
    starttime = time.time()
    pool = threadpool.ThreadPool(4)
    requests = threadpool.makeRequests(scan, portlist)
    [pool.putRequest(req) for req in requests]
    pool.wait()
    print('this scan use:%s sed' % (time.time() - starttime))


Tips:

pool = ThreadPool(poolsize)  
requests = makeRequests(some_callable, list_of_args, callback)  
[pool.putRequest(req) for req in requests]  
pool.wait()  

第一行定义了一个线程池,表示最多可以创建poolsize这么多线程;
第二行是调用makeRequests创建了要开启多线程的函数,以及函数相关参数和回调函数,其中回调函数可以不写,default是无,也就是说makeRequests只需要2个参数就可以运行;
第三行用法比较奇怪,是将所有要运行多线程的请求扔进线程池,[pool.putRequest(req) for req in requests]等同于
for req in requests:  
pool.putRequest(req)
第四行是等待所有的线程完成工作后退出。

如果list_of_args需要传入两个参数,maybe可以构造字典,以及if __name__ == '__main__':
的用法需要熟悉

二、以下是一个简单御剑的代码,均加了线程池

import requests
import threadpool
import time

def savetxt(url):
    with open('domain.txt','a') as f:
        url = url + '\n'
        f.write(url)

def geturl(url):
    r=requests.get(url,timeout=3)
    new_status_code=r.status_code
    print(new_status_code)
    if new_status_code == 200:
        print(url+'     存在')
        savetxt(url)
    else:
        print(url+'      怕是挂了')

if __name__=='__main__':
    url=input('请输入要扫描的网站:')
    new_list=[]
    with open('local.txt', 'r') as f:
        list = f.readlines()
        for i in list:
                new_url=url + i.strip()
                new_list.append(new_url)
    starttime = time.time()
    pool=threadpool.ThreadPool(3)
    my_requests=threadpool.makeRequests(geturl,new_list)
    [pool.putRequest(req) for req in my_requests]
    pool.wait()
    print(('this scan use %s sed') % (time.time() - starttime))



Tips:

1、可以看出线程池在整个代码引用了requests模块时候需要更改线程池部分代码的名称,避免造成名字重复。
2、注意代码的缩进,避免代码执行顺序不符合预期。(比如如果'my御剑.py'线程池直接写在new_list.append(new_url)下面的话就会重复执行new_list。

 

 

你可能感兴趣的:(Python学习)