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.
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.
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)
@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
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
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:
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
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.