Seite 1 von 1

Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 15:40
von egon11
Hallo, ich möchte mit Python einen host abfragen, ob er erreichbar ist. Und habe mir folgendes gebastelt, was auch funktioniert.
Meine frage wäre ob ich da (außer die Variablen Namen) noch etwas optimieren kann.

Code: Alles auswählen

command = "curl ip:port"
befehl = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True)
status = "ncht erreichbar"
for i in befehl.stdout:
    status = "erreichbar"
print(status)

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 17:03
von __blackjack__
@egon11: ``shell=True`` sollte man nicht verwenden, es macht hier auch keinen Sinn eine Shell dazwischen zu schalten.

Die ``for``-Schleife ist eine etwas undurchsichtige Art zu Testen ob das externe Programm etwas auf seiner Standardausgabe schreibt.

Der Status des externen Programms wird nicht abgefragt, wodurch das Betriebssystem die Ressourcen für den externen Prozess erst später freigeben kann, als es eigentlich erforderlich ist.

`Popen` ist hier gegenüber `subprocess.run()` unnötig umständlich.

Warum überhaupt ein externes Programm bemühen statt einfach selbst ein `socket` zu IP/Port aufmachen?

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 17:18
von egon11
Ohne shell=True geht das ganze erst gar nicht und gibt Fehler aus.
OK, ich mache es dann so:

Code: Alles auswählen

import socket
status = ""
try:
    sok = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    sok.connect(("ip", port))
    sok.close()
    status = "connexct"
except:
    status = "kein connect"
print(status)

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 17:28
von __blackjack__
Natürlich geht das auch ohne eine Shell dazwischen. Was soll die denn Deiner Meinung nach machen was man hier brauchen würde? Du musst natürlich die Argumente passend übergeben, eben so als wäre keine Shell da die eine Zeile in Argumente aufteilt und man muss in dem Kommando nichts mehr für eine Shell escapen.

Das ”nackte” ``except`` ist eine ganz schlechte Idee. Und nun testest Du auch etwas ganz anderes. Mit ``curl`` ob man da etwas per TCP herunterladen kann, und nun ob man sich zu einem Datagramm-Port verbinden kann – was keinen Sinn macht, denn da gibt's ja gerade keine Verbindung.

Vielleicht solltest Du erst einmal klären was genau Du testen möchtest.

Wenn `status` entweder im ``try``- oder im ``except``-Block definiert wird, macht es wenig Sinn das vorher mit einem Wert zu belegen der niemals irgendwo verwendet wird.

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 17:41
von egon11
Es soll lediglich prüfen, ob die ip Adresse vorhanden oder nicht.
Mehr nicht.

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 17:45
von egon11
Und nochmal wegen shell=True, wenn ich das obige mit shell=True ausführe, dann gibt es keine Fehlermeldung, wenn ich aber shell=True weg lasse, dann kommt folgender Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "/home/matze/Schreibtisch/neu.py", line 5, in <module>
    befehl = subprocess.Popen(command, stdout=subprocess.PIPE)
  File "/usr/lib/python3.6/subprocess.py", line 729, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.6/subprocess.py", line 1364, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'curl ip:port': 'curl ip:port
ip und port habe ich selbst ersetzt.

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 19:13
von __deets__
Wenn du shell=True weglässt, musst du das Kommando und die Argumente als Liste übergeben.

[“curl”, “ip:port”]

Sagt die Fehlermeldung ja auch. Alles zusammengemanscht ist kein bekanntes Kommando.

Re: Netz Adresse abfragen

Verfasst: Mittwoch 28. August 2019, 20:03
von nezzcarth
egon11 hat geschrieben: Mittwoch 28. August 2019, 17:41 Es soll lediglich prüfen, ob die ip Adresse vorhanden oder nicht.
Das tut das Script aber nicht. Curl schickt (standardmäßig) einen HTTP Request an den spezifizierten (TCP) Port. Das ist eine viel spezifischere Aufgabe mit höhren Anforderungen, als das Prüfen, ob eine IP Adresse existiert (wie __blackjack__ auch schon meinte). IP-Adressen sind Teil des IP-Portokolls, Ports sind Teil von Protokollen wie TCP oder UDP, die auf IP aufsetzen. Um zu prüfen, einer IP Adresse ein Rechner zugeordnet ist, kann man z.B. ICMP (üblicherweise per 'ping', was aber leicht von Firewalls unterbunden werden kann) oder (im lokalen Netzwerk) ARP verwenden.