Anfänger sucht Rat

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Bömmel
User
Beiträge: 4
Registriert: Montag 13. Juni 2011, 19:04

Halli Hallo,

Aufgrund der Natur meines Schnipsels sollte ich wohl erst erklären, dass ich nicht beabsichtige damit etwas anzustellen.
Ich habe gestern damit angefangen, da mir mein Mitbewohner mit seiner Musik auf die Nerven ging - kurz und knapp:
Ich wollte gerne seinen PC 'remote' herunterfahren und dachte man könnte das mit massig ping anfragen probieren.
Ich bezweifle dass das ganze so funktioniert, aber darum geht es mir auch nicht. Es ist das erste mal, dass ich mich tiefer mit so etwas beschäftige, mein erstes script (also bitte nicht lachen) - und ich hänge seit gestern Nacht an folgendem Problem (code vereinfacht):

Code: Alles auswählen

print('pinging.. press ctrl+c to quit\n')
try:
    for i in range([x]):
        os.system('tcping [ip] [port]')
    else:
        print('fin..')
except KeyboardInterrupt:
    print('pressed ctrl+c')
except IOError:
    print('effing IOError')
finally
    print('exiting')
Die for Folge läuft wunderbar, jedoch konnte ich sie nicht abbrechen, daher der try..finally block.
Jedoch bekomme bei "ctrl+c" einen 'IOError'(s.u.) ausgegeben, die exceptions werden einfach übergangen, das script bleibt stehen und ich muss das terminal manuell schließen.

Code: Alles auswählen

^CException IOError: (32, 'Broken pipe') in ,_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> ignored
tl;dr: for folge mit exceptions unterbrechen funktionert nicht - was mache ich falsch?

Vielen Dank im vorraus für eure Antworten :)
Gruß Bömmel

p.s. ich hab es mal ausprobiert und war doch ein bisschen stolz zu hören, dass kaspersky meine spielerei als 'angriff' betrachtet :p
Zuletzt geändert von Bömmel am Montag 13. Juni 2011, 22:28, insgesamt 3-mal geändert.
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

betrachten wir mal den Teil, der nicht geht :

Code: Alles auswählen

for i in range([x]):
    os.system('tcping [ip] [port]')
Als erstes kann man sagen, du solltest erst noch ein bisschen Python lernen oder dein Schipsel ist unvollständig. Denn du musst zuerst einmal x definieren oder direkt eine Zahl angeben und die eckigen Klammern sind überflüssig. Ich kenn mich nicht sehr gut mi Linux aus, aber was ich kurz gelesen habe sollte "ping" für dich das richtige sein und dann hoffe ich doch, dass du [ip]:[port] für durch die Ip deines Mitbewohners ersetzt, sonst geht das auch nicht. Außerdem könntest du dir die for-Schleife im gesamten sparen, aber das ist eh egal, denn mit dieser Variante und mit nur einem Pc, wirst du dein Ziel sowieso nie erreichen, also schreib lieber etwas anständiges ^^
lunar

@waki: Es ist wohl offensichtlich, dass dieser Teil abgeändert wurde, weil der OP nicht zeigen möchte, welche Adresse er wie oft anpingen möchte. Dass "[ip]" und "[port]" im echten Programm durch entsprechende Werte ersetzt sind, kann man dem OP schon zutrauen, selbst wenn er nach eigener Aussage wenig versteht von Python. Die "for"-Schleife kann sich der OP auch nicht sparen, denn es geht ja gerade darum, dass Ziel wiederholt anzupingen. Und das eben auch mit tcping, und nicht mit ping.

@Bömmel: Man kann ein System nicht mit Pings nicht zum Absturz bringen, und schon gar nicht herunterfahren. Wenn Dein Mitbewohner Dich nervt, dann musst Du ihm das sagen.

Im Bezug auf Dein Skript: Zeige bitte den unveränderten Quelltext, oder zumindest einen, mit dem man das Problem reproduzieren kann.
Bömmel
User
Beiträge: 4
Registriert: Montag 13. Juni 2011, 19:04

@lunar
vielen Dank für die Antwort, dann kann ich mir das sparen :)
Wie gesagt, ich gehe selber NICHT(edit) davon aus, dass ich damit irgendetwas anrichten kann. Es war eher ein produkt von zu wenig Schlaf.

Hier der komplette Code:

Code: Alles auswählen

#!/usr/bin/python
# Filename ping.py

import os

me = os.system("sudo ifconfig | grep -i bcast | cut -d: -f3- | cut -d' ' -f1 | cut -d. -f-3")  # IP Umgebung ausgeben
os.system("sudo nmap -sn -f 192.168.2.0/24 | grep 'scan report' | head -n -1 | cut -d' ' -f5-") # PCs im Netzwerk anzeigen

info = True # Variablen sammeln

while info:
	ip = input('ping: 192.168.2.')
	print('looking for ports..\n')
	os.system('sudo nmap -f 192.168.2.%s | grep open' %ip) # suche nach offenen ports
	port = input('port: ')
	x = int(input('pings: '))
	info = False

print('pinging.. press ctrl+c to quit\n')
try:
	for i in range(x):
		os.system('tcping 192.168.2.%s %s' %(ip, port))
	else:
		print('fin..')
except KeyboardInterrupt:
	print('pressed ctrl+c')
except EOFError:
	print('pressed ctrl+d')
except IOError:
	print('effing IOError')
finally:
	print('exiting')
edit: die 'me' variable wollte ich einsetzen um das 192.168.2. zu automatisieren, allerdiings hat das noch nicht geklappt. Hat aber keine Priorität, habe mich noch nicht so viel mit beschäftigt.

edit3: ich wollte auch nur erklären wie ich auf die idee komme, hatte bei der erklärung auf ein schmunzeln gehofft (hoffe es ist doch gelungen). Ich nehme das ganze selber nicht so ernst, keine Sorge.

edit4: ich würde mich auch über generelle tips zum Aufbau freuen. Z.b. bin ich mir nicht sicher, ob die Art und weise wie ich Ausgaben "zurechtgeschnitten" habe sinnvoll ist, oder auf anderen pcs probleme bringt
Bömmel
User
Beiträge: 4
Registriert: Montag 13. Juni 2011, 19:04

hmm.. also

Code: Alles auswählen

try:
	for i in range(1,50000):
		print(i)
	else:
		print('loop over')
except KeyboardInterrupt:
	print('ctrl+c')
finally:
	print('exiting')
lässt sich einwandfrei unterbrechen und es wird ctrl+c sowie 'exiting' ausgegeben.
Dementsprechen liegt es wohl am os.system befehl?

Mein code gibt mir erstaunlicherweise auch keinen IOError mehr aus, dafür stopt die for Folge auch nicht mehr wenn ich ctrl+c drücke... ich werde das Gefühl nicht los, dass ich etwas daran nicht verstanden habe..
joshi
User
Beiträge: 8
Registriert: Sonntag 30. November 2008, 17:26

Bömmel hat geschrieben:hmm.. also

Code: Alles auswählen

try:
	for i in range(1,50000):
		print(i)
	else:
		print('loop over')
except KeyboardInterrupt:
	print('ctrl+c')
finally:
	print('exiting')
lässt sich einwandfrei unterbrechen und es wird ctrl+c sowie 'exiting' ausgegeben.
Dementsprechen liegt es wohl am os.system befehl?
Ja, das liegt an os.system. Dieser Befehl startet nämlich eine neue Shell und führt den Befehl darin aus. Wenn du nun Ctrl+C drückst brichst du damit den Befehl in dieser Shell ab und kehrst sofort zum Pythonskript zurück, welches dann wegen der for-Schleife den Befehl sofort nochmals ausführt. D.h. dein Pythonskript bekommt gar nicht mit, dass du Ctrl+C gedrückt hast.
Bömmel hat geschrieben: edit: die 'me' variable wollte ich einsetzen um das 192.168.2. zu automatisieren, allerdiings hat das noch nicht geklappt. Hat aber keine Priorität, habe mich noch nicht so viel mit beschäftigt.
os.system gibt den returncode des Progamms zurück ($? in bash), nicht den Inhalt von stdout.

Wenn du andere Programme ausführen willst, solltest du lieber auf das `subprocess`-Modul zurückgreifen, da hast du dann auch die Möglichkeit den Inhalt von stdout zu lesen.
Bömmel
User
Beiträge: 4
Registriert: Montag 13. Juni 2011, 19:04

Hey, danke für die Antwort. Das erklärt das natürlich.. dann war ich damit wohl ziemlich auf dem Holzweg.
Kannst du einen guten Guide zu dem Thema empfehlen (d.h. stdout und subprocesses)?
Ich habe bis jetzt 'A byte of python' in Angriff genommen, allerdings finde ich da nichts zu dem subprocess Modul (vielleicht suche ich auch nur falsch..)
Ich stelle aber fest, dass ich 'abop' erstmal komplett durcharbeiten sollte bevor ich mich wie immer irgendwo verzettele..

p.s.: in welchem Fall würde man denn os.system benutzen?

achja: die nmap Befehle sind mehr oder weniger durch trial/error entstanden, nicht dass das den Eindruck erweckt ich wüsste was ich tue :) Ich fange gerade erst an mich einzulesen und stelle fest, dass die Thematik wirklich interessant ist. Ich glaube manchmal ich studiere das falsche :)
Python gefällt mir ultra gut! Vielen Dank für die Antworten!
joshi
User
Beiträge: 8
Registriert: Sonntag 30. November 2008, 17:26

Bömmel hat geschrieben: Kannst du einen guten Guide zu dem Thema empfehlen (d.h. stdout und subprocesses)?
Ich habe bis jetzt 'A byte of python' in Angriff genommen, allerdings finde ich da nichts zu dem subprocess Modul (vielleicht suche ich auch nur falsch..)
Ich stelle aber fest, dass ich 'abop' erstmal komplett durcharbeiten sollte bevor ich mich wie immer irgendwo verzettele..
Die offizielle Dokumentation ist da doch recht ausführlich http://docs.python.org/py3k/library/subprocess.html. Wenn du mit abop fertig bist, solltest du einfach mal die Dokumentation lesen/überfliegen. Wenn du dann mal ein Problem hast hast du zumindest einen groben Überblick was es so für Module gibt und du findest die Lösung schneller.
Bömmel hat geschrieben: p.s.: in welchem Fall würde man denn os.system benutzen?
Ich benutze es eigentlich nur, wenn ich im Interpreter ein Skript quick'n'dirty zusammenhacke und zu faul bin import subprocess zu schreiben (os ist da halt kürzer :wink: ).
Sonst sollte man immer subprocess benutzen, da es anscheinend `os.system` auf lange Sicht ersetzen wird.
Dokumentation hat geschrieben:This module intends to replace several other, older modules and functions
Bömmel hat geschrieben:achja: die nmap Befehle sind mehr oder weniger durch trial/error entstanden, nicht dass das den Eindruck erweckt ich wüsste was ich tue :) Ich fange gerade erst an mich einzulesen und stelle fest, dass die Thematik wirklich interessant ist. Ich glaube manchmal ich studiere das falsche :)
Python gefällt mir ultra gut! Vielen Dank für die Antworten!
Ja, das einfache ausprobieren sollte man nicht unterschätzen, da lernt man wirklich einiges.
Schön, dass dir Python gefällt.
Antworten