Mittwoch, 9. Juni 2010

[Tutorial] Router Reconnect mit cURL

Danke für diese Anleitung. Meine alte ist leider opfer von einer Neuinstallation und Umstellung in meinem Forum gewesen.

Benötigt wird
Mozilla Firefox
Live HTTP Headers
cURL

Einleitung

Zuerst will ich noch kurz erklären, was wir hier eigentlich machen. Um die Internetverbindung zu trennen, muss man für gewöhnlich einen Button im Webinterface des Routers anklicken. Dabei wird vom Client (Browser) ein http-Request an den Router gesendet, der diesen dazu veranlasst, die Verbindung zum WWW zu kappen. Das Herstellen der Verbindung läuft genauso ab. Um herauszufinden, was genau beim Reconnect an den Router gesendet wird, zeichnen wir den gesamten Vorgang mit live http headers auf und erstellen aus dem Ergebnis eine Batch für cURL.

IP des Routers

Zuallererst sollte man die lokale IP-Adresse des Routers wissen. Dazu müsst ihr unter Start => Programme => Zubehör => die Eingabeaufforderung öffnen und in diese ipconfig eingeben und Enter drücken. Dann sollte bei Standardgateway die IP-Adresse eures Routers stehen.











 
Login
Grundsätzlich gibt es zwei Möglichkeiten, wie ihr euch am Router einloggen könnt. Wenn ihr die lokale IP eures Routers im Browser aufruft und es erscheint gleich zu Beginn ein solches Fenster wie auf dem Screenshot, dann handelt es sich um ein so genanntes htaccess-Login.


Dies ist der weitaus günstigere Fall. Bei einem solchen Login müsst ihr eure Zugangsdaten auf folgende Weise in die Batch schreiben.



http://Benutzername:Passwort@IP des Routers
Weitaus schwieriger wird es, wenn das Login über ein HTML-Formular erfolgt. Dies könnte etwa so aussehen:

Um ein solches Login mit cURL nachzubauen, müsst ihr den Login-Vorgang mit live http headers aufzeichnen. Klickt dazu auf Extras => live http headers und wechselt in das Register Generator. Die Haken bei Bilder und CSS könnt ihr rausnehmen zwecks der Übersicht. Loggt euch nun ein und seht euch das Ergebnis an. Es könnte in etwa so aussehen:



POST /login.php username=Benutzername&password=Passwort


Dies würde folgendem cURL-Aufruf entsprechen:



curl „http://192.168.1.1/login.php” -d “username=Benutzername&password=Passwort” –c „cookies.txt“


Durch den Parameter –c speichert cURL alle Cookies in die angegebene Datei. Um diese später zu verwenden, muss man den Parameter –b „cookies.txt“ einsetzen.

Reconnect aufzeichnen

Wenn ihr eingeloggt seid, geht zu der Seite, auf der sich ein Button mit der Aufschrift „Verbindung trennen“ oder so ähnlich befindet.





Öffnet jetzt über Extras das vorher installierte Addon live http headers und klickt danach auf den Button, um die Verbindung zu trennen und wiederum, um die Verbindung wieder herzustellen. Live http headers hat inzwischen den gesamten Vorgang aufgezeichnet. Wechselt also in das Fenster von live http headers und geht in das Register Generator. Das Ganze sollte in etwa so aussehen:


Bat-Datei erstellen


Hier sind nun alle POST und GET-Requests, die an den Router gesendet wurden, aufgelistet. Ihr müsst nun herausfinden, welche Zeilen ihr davon benötigt. Das ist im Grunde sehr einfach. In meinem Fall wurden ein paar Javascript-Dateien (.js) und ein Bild (.gif) angefordert. Diese Zeilen sind für den Reconnect vollkommen unwichtig. Nur die erste und die fünfte Zeile werden benötigt. Wenn ihr wisst, welche Zeilen ihr braucht, kopiert euch diese heraus und öffnet einen beliebigen Texteditor. (zB Windows Notepad) Fügt dort die Zeilen erst einmal unverändert ein. In meinem Fall wurden zwei POST-Requests an den Router gesendet, der erste, um die Verbindung zu trennen und der zweite, um sie wieder herzustellen. Dass es sich um POST handelt, erkennt man am Schlüsselwort POST am Anfang der Zeile. Im Grunde kommen nur POST und GET in Frage.


Nun muss man das Ganze so umbauen, dass curl die beiden Requests an den Router senden kann. Nehmen wir uns die erste Zeile vor:

POST /?ce=1&be=0&l0=-1&l1=-1 0=13&1=Shared_Internet&5=2
Der erste Teil vor dem Leerzeichen (rot) zeigt an, wohin der Request gesendet wurde. Beim zweiten Teil hinter dem Leerzeichen (blau) handelt es sich um die POST-Daten. Das Ganze sieht als curl-Aufruf folgendermaßen aus:

curl „http://Benutzer:Passwort@10.0.0.138/?ce=1&be=0&l0=-1&l1=-1“ –d „0=13&1=Shared_Internet&5=2“
Durch den Parameter –d wird der blaue Teil als POST versendet. Wenn ihr euch am Router gar nicht einloggen müsst, dann kann Benutzer:Passwort@ natürlich weggelassen werden. Genau dasselbe muss man jetzt noch mit der zweiten Zeile machen und man ist schon so gut wie am Ziel.

Aus diesen zwei Zeilen

POST /?ce=1&be=0&l0=-1&l1=-1 0=13&1=Shared_Internet&5=2
POST /?ce=1&be=0&l0=-1&l1=-1 0=12&1=Shared_Internet&5=2
ist also das hier geworden:

curl "http://Benutzer:Passwort@10.0.0.138/?ce=1&be=0&l0=-1&l1=-1" -d "0=13&1=Shared_Internet&5=2"
curl "http://Benutzer:Passwort@10.0.0.138/?ce=1&be=0&l0=-1&l1=-1" -d "0=12&1=Shared_Internet&5=2"
Das sieht sehr kompliziert aus, ist aber im Grunde ganz einfach.

Die Textdatei müsst ihr jetzt nur noch mit der Endung bat abspeichern und schon könnt ihr ausprobieren, ob es funktioniert.

Sonderzeichen
Sonderzeichen werden vom Kommandozeileninterpreter cmd.exe, (also dem schwarzen Fenster mit grauer Schrift ;-)) anders interpretiert. Dies kann man ungehen, indem man die einzelnen Teile (URL, Post-Daten...) in doppelte Hochkommata setzt. Nicht so beim Prozentzeichen, dieses wird auch dann nicht als reiner String interpretiert. Um dieses Problem zu lösen, muss man jegliche Prozentzeichen verdoppeln, also hinter jedes Prozentzeichen ein weiteres einfügen.

Beispiel:

curl -d "MODEM_LOG=&dial=Connect&message=Session+is+being+terminated%0D%0A" "http://192.168.0.1/st_poe.cgi"

...wird zu
curl -d "MODEM_LOG=&dial=Connect&message=Session+is+being+terminated%%0D%%0A" "http://192.168.0.1/st_poe.cgi"


Ergebnis testen



Zum Testen könnt ihr beispielsweise auf die Seite http://whatismyip.org gehen und euch die aktuelle IP merken. Führt dann die reconnect.bat per Doppelklick aus und schaut, ob sich die IP verändert.


Die curl.exe muss (logischerweise) im selben Ordner liegen, wie die reconnect.bat!
Viel Erfolg!


http://www.paehl.de/php/contact/
Wenn das ganze funktioniert schickt mir das Ergebnis damit ich das ganze in meiner Datenbank übernehmen kann: siehe http://www.paehl.de/reconnect

Übernommen wird es dann in diesem Programm

1 Kommentar:

  1. rem neuer asus router ASUS RX3041_B
    start /min /wait m:\soft\reconnect\ASUS_RX3041_B_reconnect\curl "http://admin:184.xyz.266.89K.@192.168.1.253/start_apply.htm" -d "typeForm=formManuallyWAN&current_page=device-map%2Finternet.asp&preferred_lang=DE&flag=nodetect&StartWAN=0&StopWAN=1"
    start /min /wait m:\soft\reconnect\ASUS_RX3041_B_reconnect\curl "http://admin:184.xyz.266.89K.@192.168.1.253/start_apply.htm" -d "typeForm=formManuallyWAN&current_page=device-map%2Finternet.asp&preferred_lang=DE&flag=nodetect&StartWAN=1&StopWAN=0"

    AntwortenLöschen