Сканируйте все возможные порты хоста с помощью Python.Python

Программы на Python
Ответить
Anonymous
 Сканируйте все возможные порты хоста с помощью Python.

Сообщение Anonymous »

Я пишу программу, которая должна сканировать все 65535 портов хоста в поисках открытых. Это то, что у меня есть до сих пор, и это работает, но каждый раз, когда я выполняю скрипт, он дает разные результаты, почему это происходит?

Код: Выделить всё

def check_open_port(host, port):
s = socket.socket()
s.settimeout(0.1)
# the SO_REUSEADDR flag tells the kernel to reuse a local
# socket in TIME_WAIT state, without waiting for its natural
# timeout to expire.
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

try:
code = s.connect_ex((host, port))
s.close()

if code == 0:
return True
else:
return False
except socket.error:
return False

def get_open_ports(host, max_port=65535):
open_ports = []

def worker(port):
if check_open_port(host, port):
open_ports.append(port)

pool = ThreadPoolExecutor(max_workers=10000)
[pool.submit(worker, port) for port in range(1, max_port + 1)]
pool.shutdown(wait=True)

return open_ports
Например, на хосте с открытыми портами 22, 80 и 443 иногда я получаю такой ответ:

Код: Выделить всё

[22, 80]
и иногда я получаю:

Код: Выделить всё

[22, 80, 443]
или даже:
Хосты с большим количеством открытых портов создают больше комбинаций.

Я экспериментировал со значениями max_workers и settimeout(), но не смог заставить их работать нормально. Единственный раз, когда это сработало, было без использования потоков, но, очевидно, это заняло много времени, мне нужно их использовать.

Я что-то упустил? Есть ли другой способ реализовать это?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»