hmchzb19 发表于 2015-04-10 10:11

请大家帮我看一个端口扫描的python 脚本,为什么打印出来都是22端口。

本帖最后由 hmchzb19 于 2015-04-10 10:12 编辑

from threading import Semaphore
import threading
import time
import socket, subprocess,sys
from datetime import datetime
import thread
import shelve
'''section 1 '''
subprocess.call('clear',shell=True)
shelf = shelve.open("security.data")
data=(shelf['desc'])
screenLock=Semaphore(value=1)

class myThread (threading.Thread):
    def __init__(self, threadName,rmip,r1,r2,c):
      threading.Thread.__init__(self)
      self.threadName = threadName
      self.rmip = rmip
      self.r1 = r1
      self.r2 = r2
      self.c =c
    def run(self):

      scantcp(self.threadName,self.rmip,self.r1,self.r2,self.c)


def scantcp(threadName,rmip,r1,r2,c):
    try:
      for port in range(r1,r2):
            sock= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #sock= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            socket.setdefaulttimeout(c)
            result = sock.connect_ex((rmip,port))
            screenLock.acquire()
            if result==0:
                print "Port open:-------->\t",port,"--",data.get(port,"Not in database")
                sock.close()
            screenLock.release()
    except KeyboardInterrupt:
      print "You stop this "
      sys.exit()
    except socket.gaierror:
      print "Hostname could not be resolved"
      sys.exit()
    except socket.error:
      print "could not connect to server"
      sys.exit()

    shelf.close()

print "*"*60
print "\tWelcome this is the Port scanner \n "
d=raw_input("\t Press D for Domain Name or Press I for IP Address\t")
if (d.upper()=='D'):
    rmserver = raw_input("\t Enter the Domain Name to scan:\t")
    rmip = socket.gethostbyname(rmserver)
elif(d.upper()=='I'):
    rmip = raw_input("\t Enter the IP Address to scan: ")
else:
    print 'wrong input'
#rmip = socket.gethostbyname(rmserver)
r11 = int(raw_input("\t Enter the start port number\t"))
r21 = int(raw_input("\t Enter the last port number\t"))

conect=raw_input("For low connectivity press L and High connectivity Press H\t")
if (conect.upper()=='L'):
    c=2
elif(conect.upper() =='H'):
    c=0.5
else:
    print "\t wrong Input"

print "\n Scanner is working on ",rmip
print "*"*60
t1= datetime.now()
tp=r21-r11
tp=r21-r11

tn =30
# tn number of port handled by one thread
tnum=tp/tn # tnum number of threads
if (tp%tn != 0):
    tnum= tnum+1
if (tnum > 300):
    tn = tp/300
    tn= tn+1
    tnum=tp/tn
    if (tp%tn != 0):
      tnum= tnum+1

'''section 5'''
threads= []

try:
    for i in range(tnum):
#print "i is ",i
      k=i
      r2=r11+tn
# thread=str(i)
      thread = myThread("T1",rmip,r11,r2,c)
      thread.start()
    threads.append(thread)
    r11=r2
except:
    print "Error: unable to start thread"

print "\t Number of Threads active:", threading.activeCount()
for t in threads:
    t.join()
print "Exiting Main Thread"
t2= datetime.now()
total =t2-t1
print "scanning complete in " , total跑的结果如下:

       Number of Threads active: 35
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Exiting Main Thread
scanning complete in0:00:00.408475
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database
Port open:-------->        22 -- Not in database

haooooaaa 发表于 2015-04-10 10:46

shelf = shelve.open("security.data")

这个是? 不在这里面?

hmchzb19 发表于 2015-04-10 10:53

这个是手动创建的,用另外的脚本,里面添加了些端口和描述import shelve
def create():
    shelf = shelve.open("security.data", writeback=True)
    shelf['desc'] ={}
    shelf.close()
    print "Dictionary is created"


def update():
    shelf = shelve.open("security.data", writeback=True)
    data=(shelf['desc'])
    port =int(raw_input("Enter the Port: "))
    data= raw_input("\n Enter the description\t")
    shelf.close()

haooooaaa 发表于 2015-04-10 11:17

本帖最后由 haooooaaa 于 2015-04-10 11:21 编辑

是不是 myThread 这个类没 start() ?   101 行,

看错了,你是继承 threading不过你那个 run() 有运行?

hmchzb19 发表于 2015-04-10 11:21

threading.Thread
class Thread(builtins.object)
|A class that represents a thread of control.
|
|This class can be safely subclassed in a limited fashion. There are two ways
|to specify the activity: by passing a callable object to the constructor, or
|by overriding the run() method in a subclass.

问题不在那里,问题出在
def scantcp(threadName,rmip,r1,r2,c):
    try:
      for port in range(r1,r2):
            sock= socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            #sock= socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
            socket.setdefaulttimeout(c)
            result = sock.connect_ex((rmip,port))
            screenLock.acquire()
            if result==0:
                print "Port open:-------->\t",port,"--",data.get(port,"Not in database")
                sock.close()
            screenLock.release()

我扫描从1-1000的端口,但是print "port" 的值总是打印出来是22.

haooooaaa 发表于 2015-04-10 11:22

回复 5# hmchzb19


    我直接把你的 scantcp 运行是可以扫描的,问题应该是你的类那边的 run() 问题?

hmchzb19 发表于 2015-04-10 11:28

你试着跑一下脚本就知道问题在哪里了。
页: [1]
查看完整版本: 请大家帮我看一个端口扫描的python 脚本,为什么打印出来都是22端口。