python写端口扫描器_Python脚本写端口扫描器(socket,python-nmap)

目录

一个用python写的简单的端口扫描器,python环境为 3.7.0,windows系统

Socket模块编写

扫描给定主机是否开放了指定的端口

TCP连接扫描是利用TCP的三次握手来确定主机的端口是否开放。确定主机端口开放之后,给端口发送消息,接收端口返回的消息,然后判断该端口运行的服务。

使用时,-H 参数可以提供主机的域名或者ip地址,-p/-P 写要扫描的端口,多个端口用逗号分隔

# -*- coding: utf-8 -*-

"""

Created on Sat Nov 3 16:44:28 2018

@author: 小谢

"""

import optparse

from socket import *

import threading

threadLock=threading.Lock() #实例化threadLock对象

def connScan(Host,Port):

try:

conn=socket(AF_INET,SOCK_STREAM)

conn.connect((Host,Port))

conn.send('test message'.encode("utf-8")) #发送测试信息给端口

results=conn.recv(100) #接收主机返回的信息

threadLock.acquire() #加锁

print('[+]%d/tcp open'% Port)

print('[+] '+results.decode("utf-8"))

conn.close()

except Exception as e:

threadLock.acquire()

print(e)

print('[-]%d/tcp closed'% Port)

finally:

threadLock.release() #释放锁

conn.close()

def portScan(Host,Ports):

try:

IP=gethostbyname(Host) ##获得对应主机的ip地址

except:

print("[-] Cannot resolve '%s':Unknown host" %Host)

return

try:

Name=gethostbyaddr(Host) ##获得ip对应主机的信息

print ("\n[+] Scan Results for:"+Name[0])

except:

print ("\n[+] Scan Results for:"+IP)

setdefaulttimeout(1)

for Port in Ports:

print ("Scanning port "+Port)

connScan(Host,int(Port))

def main():

usage="usage %prog -H -p/-P "

parser=optparse.OptionParser(usage) #创建对象实例

parser.add_option('-H',dest='Host',type='string',help='target host') ##需要的命令行参数

parser.add_option('-P','-p',dest='Ports',type='string',help='target ports')

(options,args)=parser.parse_args()

Host=options.Host

Ports=str(options.Ports).split(',')

if (Host==None)|(Ports==None): ##如果主机和端口都是空的话

print(parser.usage)

exit(0)

portScan(Host,Ports)

if __name__=='__main__':

main()

python-nmap模块编写

我们还可以通过调用nmap进行端口扫描。

扫描给定ip或给定网段内指定端口是否开放

-H 参数可以扫描一个ip地址也可以扫描一个网段,-p 只能指定一个端口

# -*- coding: utf-8 -*-

"""

Created on Thu Nov 8 14:26:15 2018

@author: 小谢

"""

import nmap

import optparse

def Test(Hosts,port):

nm=nmap.PortScanner()

nm.scan(Hosts,port)

port_int=int(port) #将端口从字符串转化为int类型的

for t in nm.all_hosts():

if nm[t].has_tcp(port_int): #如果445端口提供了TCP协议

state=nm[t]['tcp'][port_int]['state'] #判断该TCP 445 端口的状态

if state=='open':

print ('[+]Found Target Host:'+t)

return

def main():

usage="usage %prog -H -p/-P "

parser=optparse.OptionParser(usage) #创建对象实例

parser.add_option('-H',dest='Host',type='string',help='target host') ##需要的命令行参数

parser.add_option('-P','-p',dest='Port',type='string',help='target ports')

(options,args)=parser.parse_args()

Hosts=options.Host

Port=options.Port

if (Hosts==None)|(Port==None): #如果主机和端口都是空的话

print(parser.usage)

exit(0) #退出

else:

Test(Hosts,Port)

if __name__=='__main__':

main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值