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.
ping mit python
Mit Redirects kannst du das gleich von der Shell aus in eine Datei schreiben, dazu brauchst du Python nicht.
S.a.: http://www.ee.surrey.ac.uk/Teaching/Unix/unix3.html
Code: Alles auswählen
ping wikipedia.org > test.txt
Zuletzt geändert von nezzcarth am Dienstag 15. Mai 2018, 20:48, insgesamt 2-mal geändert.
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:
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)
@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.
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?
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?
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.
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:
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
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:
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.
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)
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.
Wenn Du wirklich python benutzen willst, dann brauchst Du nicht auch noch tr und awk, denn das alles kann Python auch:
Code: Alles auswählen
import subprocess
import time
IP = "192.168.0.1"
pr = subprocess.Popen(["ping", "-D", IP], stdout=subprocess.PIPE):
for line in pr.stdout:
if line.startswith('['):
timestamp, line = line.strip().split(']', 1)
timestamp = time.strftime("%H:%M:%S", time.localtime(float(timestamp[1:])))
line = timestamp + line
print(line)
Hab gerade mal den Code ausprobier, aber da kommt die Fehlermeldung:
Code: Alles auswählen
if line.startswith('['):
TypeError: startswith first arg must be bytes or a tuple of bytes, not st]
Dafür war es auch nicht gedacht, sondern als eigenständige Alternative für ein Python-Skript. Ich hatte ja in meinem letzten Beitrag versucht deutlich zu machen, dass man genau das -- nämlich komplexe Shell-Konstrukte mit Python ausführen -- meiner Meinung nach nicht machen sollte. Sirius3 hat ja gezeigt, wie man sinnvoll mit Subprocess arbeitet.