1 使用单线程扫描单台主机

首先实现的是对单台主机中0-1024端口的扫描,发现差不多每秒扫描一个端口,很慢。

import socket

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False if __name__ == '__main__':
host = "192.168.10.10"
for port in range(1024):
tcp_scanner(host,port)

  

2 使用多线程扫描单台主机

import threading,socket

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False if __name__ == '__main__':
host = "192.168.10.10"
for port in range(1,1024):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start()

  

在运行以上代码时,出现报错:RuntimeError: can't start new thread,原因是超过了线程启动数的上限。

解决办法是修改最大文件描述符打开数。

3 使用多线程扫描多台主机

import threading,socket,subprocess

def tcp_scanner(host,port):
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
return True
except:
# print('connected to host %s,port %d failed' %(host,port))
return False def main(): for i in range(2,255): # host = "10.224.32.%d" %i
host = "192.168.136.%d" %i
cmd = 'fping %s 1>/dev/null 2>&1;echo $?' %host
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
ret = int(p.stdout.read())
if ret == 0:
for port in range(1,4000):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start()
else:
print('status of %s:False' %host) if __name__ == '__main__':
main()

  

上面的问题又出现了,可以用的文件描述符不够,即使改到655350。毕竟是全盘扫描。

解决办法是加信号threading.Semaphore,限制线程数

'''
create 2018/9/24
version 1.0
auth jabbok
info scan all the tcp port of the listed hosts by multithreading,to know is it listened
''' import threading,socket,subprocess,time screenLock = threading.Semaphore(value=1) def tcp_scanner(host,port): socket.setdefaulttimeout(1)
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM) try:
client.connect((host, port))
print('connected to host %s,port %d successfully' %(host,port))
client.close()
screenLock.acquire()
return True except:
screenLock.acquire()
return False finally:
screenLock.release()
client.close() def main(): for i in range(2,255):
# host = "10.224.32.%d" %i
host = "192.168.136.%d" %i
cmd = 'fping %s 1>/dev/null 2>&1;echo $?' %host
p = subprocess.Popen(cmd,stdout=subprocess.PIPE,shell=True)
ret = int(p.stdout.read()) if ret == 0:
for port in range(1,4000):
th = threading.Thread(target=tcp_scanner,args=(host,port))
th.start() else:
print('status of %s:False' %host) if __name__ == '__main__':
main()

  

tcp端口扫描(python多线程)的更多相关文章

  1. Python3实现TCP端口扫描

    在渗透测试的初步阶段通常我们都需要对攻击目标进行信息搜集,而端口扫描就是信息搜集中至关重要的一个步骤.通过端口扫描我们可以了解到目标主机都开放了哪些服务,甚至能根据服务猜测可能存在某些漏洞. TCP端 ...

  2. tcp端口扫描与syn扫描

    连接网络设备时,一般都会在网络设备端选取0-65535之间的一个端口进行连接,端口扫描是指:检查网络设备上0-65535号端口哪些端口是开启状态.如果黑客扫描到某网络设备的80端口是开启状态,那么很有 ...

  3. Socket2实现tcp端口扫描

    主要的界面如下: 主要代码如下: //对于每一个线程,传过去的参数 typedef struct ThreadParamStruct { CString strIP; //要扫描的IP地址 UINT ...

  4. TCP端口扫描

    # TCP三次握手 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1 ...

  5. python端口扫描用多线程+线程安全的队列+Thread类实现

    用线程安全的队列Queue实现扫描端口数据存储 用多线程扫描端口 用Thread类实现程序组织 #coding:utf-8 import sys import socket import sys im ...

  6. TCP端口扫描类型-隐蔽扫描和僵尸扫描

    TCP扫描有三种类型:全连接扫描,隐蔽扫描,僵尸扫描.全连接扫描无须赘述. 隐蔽扫描:发送完SYN数据包以及收到SYN/ACK数据包后不再发送SCK数据包,由于没有建立完整的TCP连接,所以在目标主机 ...

  7. 简单高效的端口扫描python脚本

    欢迎python爱好者加入:学习交流群 667279387 最近为了获取虚拟机端口开放情况,写了一个简单脚本来查看.共享给大家.下面的代码在python2种测试通过 说明:concurrent是pyt ...

  8. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

  9. portscaner 多线程、多协程并发端口扫描

    import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all() so ...

随机推荐

  1. eclipse 中PlantUML的安装和使用

    安装: 填写的地址:http://hallvard.github.io/plantuml/ 安装完plantUML后,还要下载一个Graphviz https://pan.baidu.com/s/1g ...

  2. java中如何创建带路径的文件

    请教各位大侠了,java中如何创建带路径的文件,说明下 这个路径不存在 ------回答--------- ------其他回答(2分)--------- Java code File f = new ...

  3. Linux升级安装GCC G++ 6.2

    使用yum安装是不可能了,各大仓库也没有,只能自己编译安装了. 系统为CentOS 6.5,gcc为4.4.7 1 下载源代码包 当前最新版为6.2: wget http://ftp.gnu.org/ ...

  4. 程序员代码面试指南:IT名企算法与数据结构题目最优解

      第1章栈和队列 1设计一个有getMin功能的栈(士★☆☆☆) 1由两个栈组成的队列(尉★★☆☆) 5如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 8猫狗队列(士★☆☆☆)10用一个栈实现另一 ...

  5. hdu-3018 Ant Trip(欧拉路径)

    题目链接: Ant Trip Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) ...

  6. JDBCTool

    新建 *.properties属性文件,内容如下: driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/dbName userna ...

  7. socket服务器并发处理

    我们知道,服务器通常是要同时服务多个客户端的,如果我们运行上一篇实现的server和client之后,再开一个终端运行client试试,新的client就不能能得到服务了.因为服务器之支持一个连接. ...

  8. 微信小程序基础组件

    所有的组件与属性都是小写,以连字符 - 连接 共同的属性类型: class id style bind*/catch* hidden data-* block标签. <block> 并不是 ...

  9. 机器学习之SVM支持向量机

    前言            以下内容是个人学习之后的感悟,转载请注明出处~ 简介 支持向量机(support vector machine),简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义 ...

  10. Linux : Linux命令

    接触linux一段时间了,在网上搜罗了一些命令,以备后用.我有点爱上Linux了. 来自 :http://www.php100.com/html/webkaifa/Linux/2009/1106/34 ...