#coding = utf-8

 '''
python 3.4
通过简单的TCP端口连接来判断指定IP是否开放了指定端口。
''' import socket
import optparse
import re
import threading
import sys def anlyze_host(target_host):
#将从--host参数获取到的目标值转换为标准的xxx.xxx.xxx.xxx形式,其中主要是利用socket的gethostbyname函数将域名形式的值转换为四位点进制形式
try:
pattern = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') #匹配标准点进制的IP
match = pattern.match(target_host)
if match:
return(match.group())
else:
try:
target_host = socket.gethostbyname(target_host) #如果不是,就把target_host的值作为域名进行解析
return(target_host)
except Exception as err:
print('地址解析错误:',err)
exit(0)
except Exception as err:
print('请注意错误1:',sys.exc_info()[0],err)
print(parser.usage)
exit(0) def anlyze_port(target_port):
#解析--port参数传入的值,返回端口列表
try:
pattern = re.compile(r'(\d+)-(\d+)') #解析连接符-模式
match = pattern.match(target_port)
if match:
start_port = int(match.group(1))
end_port = int(match.group(2))
return([x for x in range(start_port,end_port + 1)])
else:
return([int(x) for x in target_port.split(',')])
except Exception as err:
print('请注意错误2:',sys.exc_info()[0],err)
print(parser.usage)
exit(0) def scanner(target_host,target_port):
#创建一个socket对象
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.settimeout(5)
try:
s.connect((target_host,target_port))
#s.sendall(b'hello\r\n\r\n')
#message = s.recv(100)
#if message:
print('[+]%s的%3s端口:打开' % (target_host,target_port)) #若可以建立连接,表示此端口是打开的
# print(' %s' % message.decode('utf-8'))
except socket.timeout:
print('[-]%s的%3s端口:关闭' % (target_host,target_port)) #如果连接超时,表示此端口关闭
except Exception as err:
print('请注意错误3:',sys.exc_info()[0],err)
exit(0) def main():
usage = 'Usage:%prog -h <host> -p <port>'
parser = optparse.OptionParser(usage,version='%prog v1.0')
parser.add_option('--host',dest='target_host',type='string',
help='需要扫描的主机,域名或IP')
parser.add_option('--port',dest='target_port',type='string',
help='需要扫描的主机端口,支持1-100或21,53,80两种形式')
(options,args) = parser.parse_args()
if options.target_host == None or options.target_port == None:
print(parser.usage)
exit(0)
else:
target_host = options.target_host
target_port = options.target_port target_host = anlyze_host(target_host)
target_port = anlyze_port(target_port) for port in target_port:
t = threading.Thread(target=scanner,args=(target_host,port))#多线程扫描端口
t.start() if __name__ == '__main__':
main()

运行的结果为:

 c:\Python34\python.exe TcpScanner.py --host 192.168.2.1 --port 1-1024
[+]192.168.2.1的 25端口:打开
[+]192.168.2.1的110端口:打开
[+]192.168.2.1的119端口:打开
[+]192.168.2.1的143端口:打开
[+]192.168.2.1的465端口:打开
[+]192.168.2.1的563端口:打开
[+]192.168.2.1的587端口:打开
[+]192.168.2.1的993端口:打开
[+]192.168.2.1的995端口:打开
[+]192.168.2.1的 80端口:打开
[-]192.168.2.1的 1端口:关闭
[-]192.168.2.1的 18端口:关闭
[-]192.168.2.1的 4端口:关闭
[-]192.168.2.1的 8端口:关闭
[-]192.168.2.1的 13端口:关闭
[-]192.168.2.1的 9端口:关闭
[-]192.168.2.1的 42端口:关闭
[-]192.168.2.1的 19端口:关闭
[-]192.168.2.1的 67端口:关闭
[-]192.168.2.1的 21端口:关闭
[-]192.168.2.1的 14端口:关闭
[-]192.168.2.1的 17端口:关闭
……

用python编写的简易端口扫描器的更多相关文章

  1. 使用Python编写简单的端口扫描器的实例分享【转】

    转自 使用Python编写简单的端口扫描器的实例分享_python_脚本之家 http://www.jb51.net/article/76630.htm -*- coding:utf8 -*- #!/ ...

  2. Python实现简易端口扫描器

    在网上的一些资料的基础上自己又添了些新内容,算是Python socket编程练手吧. #coding=utf-8 import socket import time import sys impor ...

  3. day-1 用python编写一个简易的FTP服务器

    从某宝上购买了一份<Python神经网络深度学习>课程,按照视频教程,用python语言,写了一个简易的FTP服务端和客户端程序,以前也用C++写过聊天程序,编程思路差不多,但是pytho ...

  4. 用python编写的无线AP扫描器

    代码如下: #coding=utf-8 import os import sys import subprocess from scapy.all import * RSN = 48 #管理帧信息元素 ...

  5. linux下简易端口扫描器

    #include<iostream> #include<string.h> #include<sys/types.h> #include<sys/socket ...

  6. Python与Hack之window下运行带参数的Python脚本,实现一个简单的端口扫描器

    1.前提是:windows已经配置好Python的环境变量: 2.进入cmd命令行模式: **输入python命令,检测是否环境配置好:显示这样说明配置环境变量没问题 **用cd命令进入Python脚 ...

  7. mac/unix系统:C++实现一个端口扫描器

    在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件, 编译环境为Mac, 系统版本10.11.6: #include < ...

  8. 【转载】Python编写简易木马程序

    转载来自: http://drops.wooyun.org/papers/4751?utm_source=tuicool 使用Python编写一个具有键盘记录.截屏以及通信功能的简易木马. 首先准备好 ...

  9. Python脚本写端口扫描器(socket,python-nmap)

    目录 Socket模块编写 扫描给定主机是否开放了指定的端口 python-nmap模块编写 扫描给定ip或给定网段内指定端口是否开放 一个用python写的简单的端口扫描器,python环境为 3. ...

随机推荐

  1. 七、docker基本命令

    Docker 基本命令 docker的基本命令 docker version :查看docker的版本号,包括客户端.服务端.依赖的Go等 [root@centos7 ~]# docker versi ...

  2. python的re模块常用方法

    正则表达式模式 模式字符串使用特殊的语法来表示一个正则表达式: 字母和数字表示他们自身.一个正则表达式模式中的字母和数字匹配同样的字符串. 多数字母和数字前加一个反斜杠时会拥有不同的含义. 标点符号只 ...

  3. python os模块部分摘录

    转自:http://www.cnblogs.com/yigehundan/p/6379586.html python 路径相关的函数os.listdir(dirname):列出dirname下的目录和 ...

  4. JSON.parse与eval区别

    两种方式都可以解析json字符串,不过有时候JSON.parse解析会失败,失败原因有多种,下面会指出一种. JSON.parse()解析json格式的数据,会对要解析的字符串进行格式检查,如果格式不 ...

  5. 九度oj 题目1207:质因数的个数

    题目描述: 求正整数N(N>1)的质因数的个数. 相同的质因数需要重复计算.如120=2*2*2*3*5,共有5个质因数. 输入: 可能有多组测试数据,每组测试数据的输入是一个正整数N,(1&l ...

  6. redis介绍和安装和主从介绍(二)

    redis正式安装过程 安装依赖,下载解压,编译安装 yum install gcc-c++ tcl wget http://download.redis.io/releases/redis-4.0. ...

  7. 算法复习——LCA模板(POJ1330)

    题目: Description A rooted tree is a well-known data structure in computer science and engineering. An ...

  8. OS X 下iso刻录U盘(系统安装启动盘)

    1. 查看盘 $diskutil list /dev/disk0 #: TYPE NAME SIZE IDENTIFIER : GUID_partition_scheme *320.1 GB disk ...

  9. P1122 最大子树和 (树形DP)

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

  10. mysql语句优化方案(网上流传)

    关于mysql处理百万级以上的数据时如何提高其查询速度的方法 最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数 ...