it-swarm.com.de

Wie überprüfe ich, ob ein Netzwerkport unter Linux geöffnet ist?

Woher weiß ich, ob ein bestimmter Port unter Linux Ubuntu geöffnet/geschlossen ist, nicht ein Remote-System, das Python verwendet? Wie kann ich diese offenen Ports in Python auflisten?

  • Netstat: Gibt es eine Möglichkeit, die Netstat-Ausgabe in Python zu integrieren?
59
Fatima

Sie können mit dem Socket-Modul einfach prüfen, ob ein Port offen ist oder nicht.

Es würde ungefähr so ​​aussehen.

import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
   print "Port is open"
else:
   print "Port is not open"
sock.close()
109
mrjandro

Wenn Sie dies in einem allgemeineren Kontext verwenden möchten, sollten Sie sicherstellen, dass der Socket, den Sie öffnen, auch geschlossen wird. Der Check sollte also eher so aussehen:

import socket
from contextlib import closing

def check_socket(Host, port):
    with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        if sock.connect_ex((Host, port)) == 0:
            print "Port is open"
        else:
            print "Port is not open"
68
Michael

Für mich würden die obigen Beispiele hängen, wenn der Hafen nicht offen wäre. Zeile 4 zeigt die Verwendung von Settimeout, um ein Hängen zu verhindern

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)                                      #2 Second Timeout
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
  print 'port OPEN'
else:
  print 'port CLOSED, connect_ex returned: '+str(result)
31
Brent Kinser

Wenn Sie sich nur um den lokalen Computer kümmern, können Sie sich auf das Paket psutil verlassen. Du kannst entweder:

  1. Überprüfen Sie alle von einer bestimmten PID verwendeten Ports:

    proc = psutil.Process(pid)
    print proc.connections()
    
  2. Überprüfen Sie alle auf dem lokalen Computer verwendeten Ports:

    print psutil.net_connections()
    

Es funktioniert auch unter Windows.

http://pythonhosted.org/psutil/

18
Joe

Für den Fall, dass Sie TCP Ports abhören möchten, ist es besser, listen aufzurufen. Der Ansatz mit tring to connect "sieht" Client-Ports von bestehenden Verbindungen nicht, weil niemand Aber diese Ports können nicht verwendet werden, um auf seine zu lauschen.

import socket


def check_port(port, rais=True):
    """ True -- it's possible to listen on this port for TCP/IPv4 or TCP/IPv6
    connections. False -- otherwise.
    """
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.bind(('127.0.0.1', port))
        sock.listen(5)
        sock.close()
        sock = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
        sock.bind(('::1', port))
        sock.listen(5)
        sock.close()
    except socket.error as e:
        return False
        if rais:
            raise RuntimeError(
                "The server is already running on port {0}".format(port))
    return True
2

Das Netstat-Tool analysiert einfach einige/proc-Dateien wie/proc/net/tcp und kombiniert sie mit dem Inhalt anderer Dateien. Ja, es ist in hohem Maße plattformspezifisch, aber für eine reine Linux-Lösung können Sie sich daran halten. In der Dokumentation zum Linux-Kernel werden diese Dateien ausführlich beschrieben, damit Sie dort nachlesen können.

Bitte beachten Sie auch, dass Ihre Frage zu vieldeutig ist, da "Port" auch serielle Schnittstelle (/ dev/ttyS * und Analoge), parallele Schnittstelle usw .; Ich habe das Verständnis einer anderen Antwort wieder verwendet, dies ist ein Netzwerkanschluss, aber ich möchte Sie bitten, Ihre Fragen genauer zu formulieren.

2
Netch

Neu in mrjandros Lösung ist ein schneller Hack, um einfache Verbindungsfehler/Timeouts zu beseitigen.

Sie können den Schwellenwert anpassen, indem Sie den Wert der Variablen max_error_count ändern und Benachrichtigungen jeglicher Art hinzufügen.

import socket

max_error_count = 10

def increase_error_count():
    # Quick hack to handle false Port not open errors 
    with open('ErrorCount.log') as f:
        for line in f:
            error_count = line
    error_count = int(error_count)
    print "Error counter: " + str(error_count)
    file = open('ErrorCount.log', 'w')
    file.write(str(error_count + 1))
    file.close()
    if error_count == max_error_count:
        # Send email, pushover, slack or do any other fancy stuff
        print "Sending out notification"
        # Reset error counter so it won't flood you with notifications
        file = open('ErrorCount.log', 'w')
        file.write('0')
        file.close()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) 
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
        print "Port is open"
else:
        print "Port is not open"
        increase_error_count()

Und hier finden Sie eine Python 3 kompatible Version (nur feste Drucksyntax):

import socket

max_error_count = 10

def increase_error_count():
    # Quick hack to handle false Port not open errors
    with open('ErrorCount.log') as f:
        for line in f:
            error_count = line
    error_count = int(error_count)
    print ("Error counter: " + str(error_count))
    file = open('ErrorCount.log', 'w')
    file.write(str(error_count + 1))
    file.close()
    if error_count == max_error_count:
        # Send email, pushover, slack or do any other fancy stuff
        print ("Sending out notification")
        # Reset error counter so it won't flood you with notifications
        file = open('ErrorCount.log', 'w')
        file.write('0')
        file.close()

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2) 
result = sock.connect_ex(('127.0.0.1',80))
if result == 0:
        print ("Port is open")
else:
        print ("Port is not open")
        increase_error_count()
1
Pitto

Bitte überprüfe die Antwort von Michael und stimme dafür. Es ist der richtige Weg, um offene Ports zu überprüfen. Netstat und andere Tools können nicht verwendet werden, wenn Sie Dienste oder Daemons entwickeln. Ich habe zum Beispiel Modbus TCP Server- und Client-Dienste für ein industrielles Netzwerk. Die Dienste können jeden Port abhören, aber die Frage ist, ob dieser Port offen ist? Das Programm wird es sein Ich kann sie nicht alle manuell überprüfen. Deshalb habe ich Folgendes getan:

from contextlib import closing
import socket
class example:
    def __init__():

       self.machine_ip = socket.gethostbyname(socket.gethostname())
       self.ready:bool = self.check_socket()

    def check_socket(self)->bool:
        result:bool = True
        with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as sock:
        modbus_tcp_port:int = 502
        if not sock.connect_ex((self.machine_ip, modbus_tcp_port)) == 0:
            result = False
        return result
1
Hadi

Hier ist ein schneller Multithread-Port-Scanner:

from time import sleep
import socket, ipaddress, threading

max_threads = 50
final = {}
def check_port(ip, port):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # TCP
        #sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
        socket.setdefaulttimeout(2.0) # seconds (float)
        result = sock.connect_ex((ip,port))
        if result == 0:
            # print ("Port is open")
            final[ip] = "OPEN"
        else:
            # print ("Port is closed/filtered")
            final[ip] = "CLOSED"
        sock.close()
    except:
        pass
port = 80
for ip in ipaddress.IPv4Network('192.168.1.0/24'): 
    threading.Thread(target=check_port, args=[str(ip), port]).start()
    #sleep(0.1)

# limit the number of threads.
while threading.active_count() > max_threads :
    sleep(1)

print(final)

Live Demo

0
Pedro Lobito