Да, да, я знаю, что могу просто использовать nmap, но я хочу попробовать это сам.Сканер многопоточного порта
Я пытаюсь написать сценарий с резьбой, чтобы найти открытые порты на целевом IP-адресе. Это то, что я прямо сейчас:
import socket, Queue
from threading import Thread
print "Target to scan: "
targetIP = raw_input("> ")
print "Number of threads: "
threads = int(raw_input("> "))
q = Queue.Queue()
# Fill queue with port numbers
for port in range(1, 1025):
q.put(port)
def scan(targetIP, port):
try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.settimeout(4)
result = s.connect_ex((targetIP, port))
if result == 0:
print 'Port {0} is open'.format(port)
s.close
q.task_done()
while q.full:
for i in range(threads):
port = q.get()
t = Thread(target=scan, args =(targetIP, port))
t.daemon = True
t.start()
Однако у меня есть несколько вопросов:
1) Когда я запускаю это как есть, он будет перебирать очереди порта, но потом просто повесить, никогда не вырывается из цикл while
, даже если очередь опустошается.
2) Если добавить печатную строку scan
, чтобы увидеть Что происходит, в основном добавить «Сканирование порта X» линии в начале и print result
строку в конце, стандартный вывод затопляется с линией «Сканирование порта» для все порты в очереди, и THEN выводятся строки результатов. Смысл, похоже, что в настоящее время скрипт не ждет result
, чтобы получить значение, и просто продолжайте итерацию, как если бы она была.
Что я здесь делаю неправильно?
'Значение, похоже, в настоящее время сценарий не ждет результата, чтобы получить значение, и просто продолжайте итерацию, как если бы это было. »Значение, скрипт работает в нескольких потоках, а не последовательно? Разве это не то, что вы хотели в первую очередь? –
Ожидание до тех пор, пока 'q.full' не будет ложным. Вы не вызываете функцию ... –