Netz Adresse abfragen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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)
Benutzeravatar
__blackjack__
User
Beiträge: 14047
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

Es soll lediglich prüfen, ob die ip Adresse vorhanden oder nicht.
Mehr nicht.
egon11
User
Beiträge: 363
Registriert: Mittwoch 14. Dezember 2016, 20:59

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
nezzcarth
User
Beiträge: 1762
Registriert: Samstag 16. April 2011, 12:47

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.
Antworten