python端口扫描工具_基于Python的简易端口扫描器

import optparse;

import nmap

from socket import *;

from threading import *;

screenLock = Semaphore(value=4) #处理多线程问题,使用screenLock.acquire()执行加锁

'''

使用socket进行端口扫描,通过socket(AF_INET,SOCK_STREAM)指定基于IPv4网络,tcp连接,

使用connect去进行连接,成功则为端口开放,失败则为端口关闭。

'''

def tconnScan(tHost,tPort):

try:

connSkt = socket(AF_INET,SOCK_STREAM)

connSkt.connect((tHost,tPort))

screenLock.acquire()

print("[+]%d/tcp open"% tPort)

screenLock.release()

connSkt.close()

except:

screenLock.acquire()

print("[-]%d/tcp closed"% tPort)

screenLock.release()

finally:

exit(0)

def tportScan(tHost,tPorts):

try:

tIP = gethostbyname(tHost)

except:

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

return

try:

tName = gethostbyaddr(tIP)

print("n[+] Scan Result for:" + tName[0])

except:

print("n[+] Scan Result for:" + tIP)

setdefaulttimeout(1)

for tPort in tPorts:

t = Thread(target=tconnScan,args=(tHost,int(tPort)))

t.start()

'''

调用nmap库做udp扫描

'''

def udpScan(tHost,tPort):

nm = nmap.PortScanner()

data=nm.scan(tHost,tPort,'-sU');

state = data['scan'][tHost]['udp'][int(tPort)]['state']

if(state == "closed"):

print("[-]%s/udp %s"% (tPort,state))

else:

print("[+]%s/udp %s"% (tPort,state))

'''

用optparse模块调用其方法来解析扫描命令,解析扫描的主机名host和扫描端口port

'''

def main() :

parser = optparse.OptionParser('usage %prog -H'+' -p -t ')

parser.add_option('-H',dest='tHost',type='string',help='specify target host')

parser.add_option('-p',dest='tPort',type='string',help='specify target port')

parser.add_option('-t',dest='tProto',type='string',help='specify target tproto')

(options,args) = parser.parse_args()

tHost = options.tHost

if(options.tProto == "t"):

if(options.tPort == "dft"):

tPorts = [80,8080,3128,8081,9080,1080,21,23,443,69,22,25,110,7001,9090,3389,1521,1158,2100,1433]

else:

tPorts = str(options.tPort).split(',')

if (tHost == None) :

print(parser.usage)

exit(0)

tportScan(tHost,tPorts)

elif (options.tProto == "u"):

if(options.tPort == "dft"):

tPorts = ['31','41','69','110','137','138','161','666','999','1027','1042','4000','8099','8255']

else:

tPorts = str(options.tPort).split(',')

if (tHost == None) :

print(parser.usage)

exit(0)

print("n[+] Scan Result for:" + tHost)

for tPort in tPorts:

udpScan(tHost,tPort)

else:

print("please input -t u(udp) or t(tcp)")

exit(0)

if __name__ == "__main__":

main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值