ping mit python

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.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Dienstag 15. Mai 2018, 20:24

Ich suche ein kleines Python Script, womit ich einen dauer-ping machen kann und das mit Zeitstempel.
Ich hab es mit shell im Terminal (Ubuntu) gemacht und das klappte gut, nur ich möchte es in eine Datei speichern, und da wäre ein kleines Python Script ideal, bin aber leider nicht fündig geworden. Hoffe es kann mir jemand helfen.
nezzcarth
User
Beiträge: 488
Registriert: Samstag 16. April 2011, 12:47

Dienstag 15. Mai 2018, 20:37

Mit Redirects kannst du das gleich von der Shell aus in eine Datei schreiben, dazu brauchst du Python nicht.

Code: Alles auswählen

ping wikipedia.org > test.txt
S.a.: http://www.ee.surrey.ac.uk/Teaching/Unix/unix3.html
Zuletzt geändert von nezzcarth am Dienstag 15. Mai 2018, 20:48, insgesamt 2-mal geändert.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Dienstag 15. Mai 2018, 20:46

Ja das wusste ich , aber ich brauch es mit Zeitstempel. Und das soll paar Stunden im Hintergrund laufen das Programm, ohne das Terminal auf zu haben.
nezzcarth
User
Beiträge: 488
Registriert: Samstag 16. April 2011, 12:47

Dienstag 15. Mai 2018, 20:47

Den Zeitstempel bekommst du mit 'ping -D'. Es las sich so, als wäre das Schreiben in eine Datei problematisch, nicht der Zeitstempel.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Dienstag 15. Mai 2018, 20:59

Ich meinte mit aktueller Zeit "ping 192.168.178.1 | perl -nle 'print scalar(localtime), " ", $_' "
Aber in einer Textdadei speichert es immer ohne Datum.
Ich dachte es gibt in Python was einfaches
__deets__
User
Beiträge: 2859
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dienstag 15. Mai 2018, 21:55

subprocess ist dein Freund.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mittwoch 16. Mai 2018, 05:06

Das hab ich auch schon versucht. Nur speichert es dann ohne Zeit.
Wenn ich das mit subprocess mache, dann macht es zwischen 5 und 15 ping's und das wars.
Auch wenn ich im Befehl "-w 1800" (steht für ping in sekunden) eingebe.
Hier mal mein code:

Code: Alles auswählen

import subprocess

ip_ping = "ping -w 1800 192.168.178.1  >> /home/matze/$(date '+%H-%M---%d-%m-%Y').txt"
subprocess.Popen(ip_ping,  shell=True)
Sirius3
User
Beiträge: 7790
Registriert: Sonntag 21. Oktober 2012, 17:20

Mittwoch 16. Mai 2018, 07:16

@egon11: shell=True sollte man nicht benutzen, Dateiumleitungen kann man direkt mit subprocess-Parametern machen. Wenn Dir die Zeitangaben mit -D nicht gefallen, dann mußt Du eben in Python jede Zeile lesen, den Zeitstempel konvertieren und dann erst in eine Datei schreiben.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mittwoch 16. Mai 2018, 15:53

Aber "ping -D" gibt mir doch keine Uhrzeit aus vor der pinggeschwindigkeit.
@Sirius3
Was meinst du mit Dateiumleitung?
__deets__
User
Beiträge: 2859
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 16. Mai 2018, 15:55

Warum rufst du ping nicht so auf, dass es nur *einen* Ping macht, und dann erzeugst und speicherst du den Zeitstempel in Python, abhaengig davon, ob ping erfolgreich war oder nicht (status-code).
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mittwoch 16. Mai 2018, 16:04

Ja den Gedanken hatte ich auch schon gehabt, in einer Schleife immer wieder ein ping mit der jeweiligen Uhrzeit davor, nur er schreibt mir, wenn ich eine while schleife 10x durchlaufe immer das Datum und Zeit in einer Zeile bzw. bei "Zeilenumbruch untereinander, und dann kommen erst die pings...
Hab vor jeden subprocess befehl mit "open("/file") das Datum mit den Modul "datetime" erzeugt, dann den "subprocess" mit ping, aber das kann ich doch bestimmt mit in den subprocess-Parameter integrieren?
__deets__
User
Beiträge: 2859
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mittwoch 16. Mai 2018, 16:30

Du musst schon auf das Ende von Ping warten. Dazu hat das subprocess Modul alles was du brauchst - zB check_call um gleich eine Ausnahme zu bekommen, wenn der returncode nicht 0 war.
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Mittwoch 16. Mai 2018, 17:33

Ok danke, gibt es irgendwo ein anständiges HowTo zum subprocess Modul? Außer https://docs.python.org/3/library/subprocess.html. Weil da nichts weiter drin steht mit Parameter und so.
nezzcarth
User
Beiträge: 488
Registriert: Samstag 16. April 2011, 12:47

Mittwoch 16. Mai 2018, 17:40

Zwei Anmerkungen:

Es ist in Python nicht üblich, Zwei-Zeilen-Programme zu schreiben, die im Prinzip nur ein Wrapper um (komplexe) Shell-Kommandos sind. Wenn du Python verwenden möchtest, schlage ich vor, vollständige Pogramme mit main-Funktion usw. zu schreiben, den (mit dem subprocess-Modul) ausgeführten Code möglichst minimal zu halten und alles Weitere in Python zu erledigen.

Ohne Python klappt es bei mir z.B. so:

Code: Alles auswählen

$ ping -D 192.168.0.1 | stdbuf -oL tr -d '[]'  | stdbuf -oL awk '{$1=strftime("%H:%M:%S", $1 ); print}' > test.txt

$ cat test.txt
01:00:00 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
18:39:59 64 bytes from 192.168.0.1: icmp_seq=1 ttl=64 time=3.02 ms
18:40:00 64 bytes from 192.168.0.1: icmp_seq=2 ttl=64 time=1.68 ms
18:40:01 64 bytes from 192.168.0.1: icmp_seq=3 ttl=64 time=3.02 ms
egon11
User
Beiträge: 97
Registriert: Mittwoch 14. Dezember 2016, 20:59

Donnerstag 17. Mai 2018, 17:53

Danke das funktioniert schon mal, genau das hab ich gesucht. Aber wenn ich das 1:1 in den Python Script einbaue, dann bleibt die Datei leer.
Edit: Python kann wahrscheinlich nicht mit den Trennzeichen "|" umgehen.

Wenn ich es mit mit:

Code: Alles auswählen

subprocess.call(command, shell=True,stdout=meintext)
probiere, dann schreibt es in eine Datei, aber leider ohne Datum.
Achja die Variable "command" ist: "ping -D 192.168.178.1".
Aber sobald das "|" mit drin ist, schreibt er nix rein.
Sorry bin noch Anfänger.
Antworten