web-dev-qa-db-fra.com

Faire un scanner de port rapide

Je réalise donc un scanner de port en python ...

import socket
ip = "External IP"
s = socket.socket(2, 1) #socket.AF_INET, socket.SOCK_STREAM

def porttry(ip, port):
    try:
        s.connect((ip, port))
        return True
    except:
        return None

for port in range(0, 10000):
    value = porttry(ip, port)
    if value == None:
        print("Port not opened on %d" % port)
    else:
        print("Port opened on %d" % port)
        break
raw_input()

Mais ceci est trop lent, je veux pouvoir en quelque sorte savoir comment fermer ou casser le code après une période de temps pour ne rien retourner. 

6
Shane

En plus de définir le délai d'expiration du socket, vous pouvez également appliquer la technique du multi-threading pour dynamiser le processus. Au mieux, ce sera N fois plus rapide si vous avez N ports à analyser. 

# This script runs on Python 3
import socket, threading


def TCP_connect(ip, port_number, delay, output):
    TCPsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    TCPsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    TCPsock.settimeout(delay)
    try:
        TCPsock.connect((ip, port_number))
        output[port_number] = 'Listening'
    except:
        output[port_number] = ''



def scan_ports(Host_ip, delay):

    threads = []        # To run TCP_connect concurrently
    output = {}         # For printing purposes

    # Spawning threads to scan ports
    for i in range(10000):
        t = threading.Thread(target=TCP_connect, args=(Host_ip, i, delay, output))
        threads.append(t)

    # Starting threads
    for i in range(10000):
        threads[i].start()

    # Locking the main thread until all threads complete
    for i in range(10000):
        threads[i].join()

    # Printing listening ports from small to large
    for i in range(10000):
        if output[i] == 'Listening':
            print(str(i) + ': ' + output[i])



def main():
    Host_ip = input("Enter Host IP: ")
    delay = int(input("How many seconds the socket is going to wait until timeout: "))   
    scan_ports(Host_ip, delay)

if __== "__main__":
    main()
13
Billy T

Envisagez de définir un délai d'attente au lieu d'une boucle for en utilisant socket.setdefaulttimeout(timeout).

2
Dataman

Cela devrait être un peu plus rapide.

#-*-coding:utf8;-*-
#qpy:3
#qpy:console

import socket
import os

# This is used to set a default timeout on socket
# objects.
DEFAULT_TIMEOUT = 0.5

# This is used for checking if a call to socket.connect_ex
# was successful.
SUCCESS = 0

def check_port(*Host_port, timeout=DEFAULT_TIMEOUT):
    ''' Try to connect to a specified Host on a specified port.
    If the connection takes longer then the TIMEOUT we set we assume
    the Host is down. If the connection is a success we can safely assume
    the Host is up and listing on port x. If the connection fails for any
    other reason we assume the Host is down and the port is closed.'''

    # Create and configure the socket.
    sock = socket.socket()
    sock.settimeout(timeout)

    # the SO_REUSEADDR flag tells the kernel to reuse a local 
    # socket in TIME_WAIT state, without waiting for its natural
    # timeout to expire.
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

    # Like connect(address), but return an error indicator instead
    # of raising an exception for errors returned by the C-level connect() 
    # call (other problems, such as “Host not found,” can still raise exceptions). 
    # The error indicator is 0 if the operation succeeded, otherwise the value of 
    # the errnovariable. This is useful to support, for example, asynchronous connects.
    connected = sock.connect_ex(Host_port) is SUCCESS

    # Mark the socket closed. 
    # The underlying system resource (e.g. a file descriptor)
    # is also closed when all file objects from makefile() are closed.
    # Once that happens, all future operations on the socket object will fail. 
    # The remote end will receive no more data (after queued data is flushed).
    sock.close()

    # return True if port is open or False if port is closed.
    return connected


con = check_port('www.google.com', 83)
print(con)
1
Ricky Wilson

voici un scanner de port simple et rapide, il scanne 100 000 ports en 180 secondes:

import threading
import socket

target = 'pythonprogramming.net'
#ip = socket.gethostbyname(target)

def portscan(port):

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(0.5)# 

    try:
        con = s.connect((target,port))

        print('Port :',port,"is open.")

        con.close()
    except: 
        pass
r = 1 
for x in range(1,100): 

    t = threading.Thread(target=portscan,kwargs={'port':r}) 

    r += 1     
    t.start() 
0
Gysi Rrjolli

socket.setdefualttimeout (heure) 

est utilisé pour continuer à essayer de se connecter avec le port pendant un temps spécifique ... lorsque vous envoyez une demande et que le délai d'attente est défini pour 2 secondes, il essaiera de se connecter au port pendant 2 secondes ... s'il n'y a pas de réponse port en 2 secondes .... il sera compté comme port mort

0
Nisarg

socket.setdefaulttimeout (0.5) Ceci accélérera le programme!

0
Muhammad Suleman

Je pense que cet extrait pourrait vous aider: http://www.coderholic.com/python-port-scanner/

0
Lukasz Ciesluk