Reconnecten eines Speedport-Routers mit curl


Für diesen Zweck hatte ich bisher immer wget benutzt, da die alten Interfaces einfache Requests aka wget http://router/reconnect?user=admin&password=blubb durchaus ausreichten. Leider sind jedoch die Interfaces der neuen Generationen nicht mehr so simpel, wir brauchen Cookies und mehrere POST-Requests. (Das Webinterface auf dem Speedport läuft übrigens auf einem Apache)

Zur Analyse benutze ich hier das Live HTTP headers Addon für Firefox. Hier der ganze Vorgang mit Login, "Trennen", "Verbinden" und dem Logout (Logout nicht vergessen! Das Interface wird sonst für eine Zeit lang als "in Benutzung" blockiert sein).

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#request# POST https://speedport.ip/data/Login.json
POST /data/Login.json password=XXX&showpw=0

#request# POST https://speedport.ip/data/Connect.json
POST /data/Connect.json req_connect=offline

#request# POST https://speedport.ip/data/Connect.json
POST /data/Connect.json req_connect=online

#request# POST https://speedport.ip/data/Login.json
POST /data/Login.json logout=byby

Sollte also nicht schwierig sein, die vier Schritte mit curl nachzubilden.
Erster Versuch: ein Login-POST-Request mit falschen Daten (erstmal rantasten):

1
curl -d "password=123" -d "showpw=0" https://speedport.ip/data/Login.json

Ergebnis: Your client does not have permission to get this page.(code=41193) from this server.

Hm, vielleicht lehnt das Ding curl ab?

1
curl -d "password=123" -d "showpw=0" -c cookies.txt --user-agent "Mozilla/5.0" https://speedport.ip/data/Login.json

403 - meh. Ach ja!

1
curl -d "password=123" -d "showpw=0" -c cookies.txt -e "https://speedport.ip/" https://speedport.ip/data/Login.json

Bingo. Referrercheck! Das Ergebnis ist ein JSON, login: failed, wie zu erwarten.

Letztlich sieht das fertige Skript dann wie folgt aus:

1
2
3
4
curl -d "password=XXX" -d "showpw=0" -c cookies.txt -e "https://speedport.ip/" https://speedport.ip/data/Login.json
curl -d "req_connect=offline" -b cookies.txt -e "https://speedport.ip/" https://speedport.ip/data/Connect.json
curl -d "req_connect=online" -b cookies.txt -e "https://speedport.ip/" https://speedport.ip/data/Connect.json
curl -d "logout=byby" -b cookies.txt -e "https://speedport.ip/" https://speedport.ip/data/Login.json

Hinweis: curl unterscheidet zwischen cookie schreiben und lesen, darum beim Login -c, um den Sessioncookie in der Datei abzulegen und -b um die Datei als Authentifizierung zu nutzen.