TCP-Options setzen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Rayman
User
Beiträge: 3
Registriert: Montag 21. August 2006, 00:20
Wohnort: Köln

Mittwoch 23. August 2006, 23:48

Hallo zusammen!
Vielen Dank erstmal für dieses Forum. Ich habe als totaler Neuling in der Socket-Programmierung schon einige sehr gute Tipps hier gefunden und so manche Anregung für spätere Programmieraufgaben aufgetan.

Nun aber zu meinem Problem:
Ich will von der XBOX aus mit einem Python-Skript die Windows-Software PowerOff 3.0.1.3 ( http://users.pandora.be/jbosman/poweroff/poweroff.htm ) fernsteuern, die es erlaubt Rechner über ein Netzwerk herunterzufahren, in den Standby zu schicken und etliches mehr. Für mich ist der Standby interessant, daher dieses Skript.
Zu diesem Zweck habe ich mir erstmal mit Ethereal die Datenpakete angesehen, die zwischen zwei Windows-Hosts mit PowerOff beim Ausführen eines Remote-Events ausgetauscht werden. Daraus ergab sich der Inhalt (a-j), der unten im Skript angegeben ist. Beim sniffen der Pakete, die mein Skript erzeugt, stellte sich leider heraus, dass mein Skript wohl etwas zu simpel angedacht ist, da die TCP-Options leider nicht mit denen übereinstimmen, die PowerOff erwartet. Hier erstmal mein code:

Code: Alles auswählen

from socket import *

# Server IP-Adresse und Port

myServer = '192.168.1.20'
myServerPort = 5556

# Data der 10 Pakete für PowerOff 3.0.1.3

a = "VERSION"
b = "PASSWORD Luxor"
c = "ACTION STANDBY"
d = "WHO LOCAL"
e = "WHEN IMMEDIATE"
f = "SIMULATE OFF"
g = "RUNPRG OFF"
h = "FORCE OFF"
i = "CANCEL OFF"
j = "DO IT"

clientsocket = socket(AF_INET, SOCK_STREAM)
clientsocket.connect((myServer, myServerPort))
clientsocket.send(a)
clientsocket.recv(1024)
clientsocket.send(b)
clientsocket.recv(1024)
clientsocket.send(c)
clientsocket.recv(1024)
clientsocket.send(d)
clientsocket.recv(1024)
clientsocket.send(e)
clientsocket.recv(1024)
clientsocket.send(f)
clientsocket.recv(1024)
clientsocket.send(g)
clientsocket.recv(1024)
clientsocket.send(h)
clientsocket.recv(1024)
clientsocket.send(i)
clientsocket.recv(1024)
clientsocket.send(j)
clientsocket.recv(1024)

clientsocket.close()
Die TCP-Options in diesen Paketen enthalten nur die Maximum Segment Size.
Die Originale von PowerOff aber zusätzlich noch
"01 01 04 02" für "NOP NOP SACK permitted", weshalb PowerOff bereits mein erstes Paket ablehnt, keine Kommunikation zustande kommt und die gewünschte Aktion nicht ausgeführt wird.
Weiss vielleicht jemand, wie ich die TCP-Options in meinem Skript entsprechend verändern kann?
Für Hilfe wäre ich sehr dankbar, da Google und die Hilfe hier im Forum mir bisher nicht wirklich weitergeholfen haben.

Rayman[/url]
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 24. August 2006, 07:01

Da kann ich dir eigentlich nicht weiterhelfen... Aber ich vermute mal, das es evtl. an AF_INET, SOCK_STREAM liegen könnte...

Vielleicht probierst du einfach mal andere Varianten aus:
http://docs.python.org/lib/module-socket.html#l2h-2602

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Donnerstag 24. August 2006, 07:11

Hi

Bist du sicher dass die analysierten Daten richtig sind?
Ich könnte mir z.B. noch vorstellen, dass es nach Version noch eine Versionsnummer kommt und bei jedem Befehl noch eine neue Zeile angefangen wird.

Gruss
Benutzeravatar
jens
Moderator
Beiträge: 8461
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 24. August 2006, 07:16

Rayman hat geschrieben:Windows-Software PowerOff 3.0.1.3 ( http://users.pandora.be/jbosman/poweroff/poweroff.htm )
Schau doch mal auf der Seite unter "5 Remote Control" da steht sogar ein beispiel...

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Rayman
User
Beiträge: 3
Registriert: Montag 21. August 2006, 00:20
Wohnort: Köln

Donnerstag 24. August 2006, 15:41

Vielen Dank für die Antworten!

@ Jens: Peinliche Sache, das hatte ich wohl überlesen ...

Werde das mal probieren.

@rayo:
Die Versionsnummer steht in der Antwort, wird mit VERSION also angefordert. Neue Zeilen könnten sein, müsste ich nochmal ins Log schauen...

Vieln Dank nochmal an euch!

Rayman
Rayman
User
Beiträge: 3
Registriert: Montag 21. August 2006, 00:20
Wohnort: Köln

Donnerstag 24. August 2006, 22:53

Ich habe die Telnet-Möglichkeit mal in ein Skript gepackt und so klappt es jetzt:

Code: Alles auswählen

import telnetlib, time

server = "192.168.1.20"

com = telnetlib.Telnet(server)
com.write("password *****\n")
com.write("action standby\n")
com.write("doit\n")
Mögliche Optionen für "standby" in Zeile 9 sind:

logoff, reboot, shutdown, poweroff, standby, hibernate, lock, monitor_off, monitor_on.

Statt der ***** muss natürlich, falls angegeben, euer Passwort stehen.

Hätte ich doch bloß mal von Anfang an richtig gelesen...


Rayman
Antworten