#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. Java-获取一个类的父类

    如何使用代码获取一个类的父类 package com.tj; public class MyClass implements Cloneable { public static void main(S ...

  2. 【原】缓存之 HttpRuntime.Cache

    1.HttpRuntime.Cache HttpRuntime.Cache 相当于就是一个缓存具体实现类,这个类虽然被放在了 System.Web 命名空间下了.但是非 Web 应用也是可以拿来用的. ...

  3. ASP.NET项目使用MYSQL数据库部署到IIS服务器找不到请求的.Net Framework Data Provider解决方案

    使用MySQL开发过程中在自己的机器上跑项目是没有问题的,但在实际部署到服务器上的时候就发生“找不到请求的.Net Framework Data Provider解决方案”错误,在排除项目本身原因之后 ...

  4. 【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分

    题目描述(转自洛谷) 加里敦大学有个帝国图书馆,小豆是图书馆阅览室的一个书籍管理员.他的任务是把书排成有序的,所以无序的书让他产生厌烦,两本乱序的书会让小豆产生这两本书页数的和的厌烦度.现在有n本被打 ...

  5. 算法复习——序列分治(ssoj光荣的梦想)

    题目: 题目描述 Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯.在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界.保卫这里的平衡与和谐.在那个时 ...

  6. hdu 1189 并查集

    Farm Irrigation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  7. 【HDOJ5955】Guessing the Dice Roll(概率DP,AC自动机,高斯消元)

    题意: 有n个人,每个人有一个长为L的由1~6组成的数串,现在扔一个骰子,依次记录扔出的数字,如果当前扔出的最后L个数字与某个人的数串匹配,那么这个人就算获胜,现在问每个人获胜的概率是多少. n,l& ...

  8. Docker安装运行Redis

    Mac环境 查询镜像: zhoumatoMBP:~ zhou$ docker search redis NAME DESCRIPTION STARS OFFICIAL AUTOMATED redis ...

  9. linux top %VSZ含义

    https://blog.csdn.net/sinohenu/article/details/58216013 https://unix.stackexchange.com/questions/449 ...

  10. Wannafly挑战赛11 D 题 字符串hash + 卡常

    题目链接 https://ac.nowcoder.com/acm/contest/73#question map与order_map https://blog.csdn.net/BillCYJ/art ...