colinardo
Goto Top

Informationen aus dem Webinterface einer Fritz!Box via Shellscript auslesen

Für alle die die Daten aus dem Webinterface einer Fritz!Box via Shellscript auslesen müssen / wollen. Die Scripte wurden mit einer Fritz!Box 7390 mit Fritz!OS 6.03 getestet. Da sich aber viele Modelle von AVM im Webinterface gleichen, sollten die Scripte auch auf anderen Modellen der Fritz!Box-Serie funktionieren.

Steht man vor der Aufgabe bestimmte Informationen der Fritz!Box automatisiert abzufragen, hilft euch vielleicht dieses Script weiter.
back-to-topDas Script kennt folgende Variablen:
_BOXURL = Adresse der Fritzbox
_USERNAME = Benutzername (wenn keiner zum Login verwendet wird, diesem einen leeren String zuweisen)
_PASSWORD = Passwort des Webinterface
_REQUESTPAGE = Die angeforderte Unterseite der Fritz!Box (mit beginnendem slash "/")
_OUTPUTFILE = Dateinamen in dem die HTML-Seite gespeichert werden soll

back-to-topShell-Script
(getestet mit einer Fritz!Box 7390 mit FRITZ!OS 6.03, sollte aber auch mit anderen Modellen von AVM funktionieren)
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_REQUESTPAGE="/fon_num/foncalls_list.lua"  
_OUTPUTFILE="OUTPUT.HTML"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  
curl -s "${_BOXURL}${_REQUESTPAGE}" -d "sid=${_SID}" >$_OUTPUTFILE  

Um an den Pfad zur entsprechenden Unterseite heran zu kommen, kann man z.B. die in Firefox integrierte Web-Konsole(STRG+SHIFT+K) oder das Plugin Firebug nutzen.
Der Inhalt der entsprechenden Fritz!Box-Seite wird nun in einer HTML-Datei gespeichert.
Diese lässt sich dann entweder weiter mit AWK,GREP etc. auf der Kommandozeile verarbeiten, oder man extrahiert die Daten z.B. mit einem PHP--Script.

back-to-topBeispiele

back-to-topScript 1: Ausfiltern des Inhalts eines HTML-Tags mit GREP auf der Kommandzeile
cat OUTPUT.html | tr -d '\n' | grep -oP '(?<=<table id="test">).*?(?=</table>)'
Im Beispiel wird alles zwischen diesen Tags ausgelesen: <table id="test"> ... </table> und auf der Kommandozeile ausgegeben. Zur weiteren Verarbeitung der HTML-Datei empfehle ich das Shell Utility awk bzw. gawk da dieses sehr mächtige String-Verarbeitung ermöglicht. Einarbeitung ist hier aber vorher Pflicht wenn man sich damit noch nicht auskennt.

back-to-topBeispiel 2: Informationen zur DSL-Qualität der Fritz!Box via Shell auslesen (nur für Firmware kleiner als 6.0 / für > 6.0 siehe Hinweis weiter unten)
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  

#DSL-Informationen zur Leitungsqualität
_PAGE_DSL_STATS=$(curl -s ${_BOXURL}/internet/dsl_stats_tab.lua -d 'sid='${_SID})  
_DATARATE_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/dsl_ds_rate\"\] = \"(.*)\"/,arr){print arr[1]};')  
_DATARATE_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/dsl_us_rate\"\] = \"(.*)\"/,arr){print arr[1]};')  
_LATENZ_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/ds_delay\"\] = \"(.*)\"/,arr){print arr[1]};')  
_LATENZ_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/us_delay\"\] = \"(.*)\"/,arr){print arr[1]};')  
_NOISEMARGIN_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/ds_margin\"\] = \"(.*)\"/,arr){print arr[1]};')  
_NOISEMARGIN_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/us_margin\"\] = \"(.*)\"/,arr){print arr[1]};')  
_DSLLINELOSS_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/ds_attenuation\"\] = \"(.*)\"/,arr){print arr[1]};')  
_DSLLINELOSS_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/\[\"sar:status\/us_attenuation\"\] = \"(.*)\"/,arr){print arr[1]};')  

#Resyncs der letzten 24h auslesen
_PAGE_STATS_GRAPH=$(curl -s "${_BOXURL}/internet/dsl_stats_graph.lua" -d 'sid='${_SID})  
_RESYNCS=$(echo "$_PAGE_STATS_GRAPH" | awk  'BEGIN {summe = 0}; match($0, /\[\"sar:status\/StatResync\"\] = \"(.*)\"/, arr){for(i = 1; i <= split(arr[1],splitted,",");i++){summe += int(splitted[i])}};END {print summe};')  

echo "Datenrate IN:             $_DATARATE_IN kbit/s"  
echo "Datenrate OUT:            $_DATARATE_OUT kbit/s"  
echo "Latenz Empfangsrichtung:  $_LATENZ_IN ms"  
echo "Latenz Senderichtung:     $_LATENZ_OUT ms"  
echo "Störabstandsmarge IN:     $_NOISEMARGIN_IN db"  
echo "Störabstandsmarge OUT:    $_NOISEMARGIN_OUT db"  
echo "Leitungsdämpfung IN:      $_DSLLINELOSS_IN db"  
echo "Leitungsdämpfung OUT:     $_DSLLINELOSS_OUT db"  
echo "DSL-Resync's (in 24h):    $_RESYNCS mal"  
Wenn eine Fritz!Box mit OS >= 6.0 eingesetzt wird muss in obigem Script Zeile 10-19 durch diesen Block ersetzt werden: (Achtung: nur getestet mit Firmware 6.03)
#DSL-Informationen zur Leitungsqualität
_PAGE_DSL_STATS=$(curl -s ${_BOXURL}/internet/dsl_stats_tab.lua -d 'sid='${_SID})  
_DATARATE_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Aktuelle Datenrate.*"c3">([0-9]+)<\/td>.*Nahtlose Ratenadaption/,arr){print arr[1]};')  
_DATARATE_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Aktuelle Datenrate.*"c4">([0-9]+)<\/td>.*Nahtlose Ratenadaption/,arr){print arr[1]};')  
_LATENZ_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Latenz.*"c3">([0-9]+) ms<\/td>/,arr){print arr[1]};')  
_LATENZ_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Latenz.*"c4">([0-9]+) ms<\/td>/,arr){print arr[1]};')  
_NOISEMARGIN_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Störabstandsmarge.*"c3">([0-9]+)<\/td>.*Trägertausch/,arr){print arr[1]};')  
_NOISEMARGIN_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Störabstandsmarge.*"c4">([0-9]+)<\/td>.*Trägertausch/,arr){print arr[1]};')  
_DSLLINELOSS_IN=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Leitungsdämpfung.*"c3">([0-9]+)<\/td>.*Leistungsreduzierung/,arr){print arr[1]};')  
_DSLLINELOSS_OUT=$(echo "${_PAGE_DSL_STATS}" | awk 'match($0,/Leitungsdämpfung.*"c4">([0-9]+)<\/td>.*Leistungsreduzierung/,arr){print arr[1]};')  

back-to-topScript 3: Syslog der Fritz!Box auslesen
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  

#Syslog auslesen
_PAGE_SYSLOG=$(curl -s "${_BOXURL}/system/syslog.lua" -d 'tab=aus' -d 'sid='${_SID})  
_RAW_LOGS=$(echo "$_PAGE_SYSLOG" | tail -n $(expr $(echo "$_PAGE_SYSLOG" | wc -l) - $(echo "$_PAGE_SYSLOG" | grep -n '' | grep -oP '^\d+')) | head -n -5)  
_SYSLOG=$(echo "$_RAW_LOGS" | awk 'match($0, /\[1\] = \"(.*)\"\,/, arr){line = arr[1]};match($0, /\[2\] = \"(.*)\"\,/, arr){line = line"\t"arr[1]};match($0, /\[3\] = \"(.*)\"\,/, arr){print line"\t"arr[1];line = ""};')  
echo "$_SYSLOG"  

back-to-topScript 4: Portfreigaben der Fritz!Box auslesen
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  

#Portforwardings auslesen
_PAGE_PFW=$(curl -s "${_BOXURL}/internet/port_fw.lua" -d 'sid='${_SID})  
_RULES=$(echo "$_PAGE_PFW" | awk  'match($0, /\[\"_node\"\] = \"(.*)\"/, arr){line = arr[1]};match($0, /\[\"activated\"\] = \"(.*)\"/, arr){if(arr[1] == 1){line = line"#Ja"}else{line = line"#Nein"}};match($0, /\[\"description\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"endport\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"fwip\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"fwport\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"port\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"protocol\"\] = \"(.*)\"/, arr){line = line"#"arr[1]; print line; line =""};')  

echo -e "--------------------------------\nPortforwardings der Fritz!Box:\n--------------------------------"  
echo -e "Regel#Aktiv#Beschreibung#Port Extern(Max)#IP-Intern#Port Intern#Port Extern(MIN)#Protokoll\n$_RULES" | column -t -s "#"  

back-to-topScript 5: Fritz!Box neu starten (Reboot)
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | grep -Poi 'sid=[a-f\d]+' | cut -d '=' -f2)  

# Box rebooten
echo 'Reboot in progress ... please allow up to 2 minutes for the box to come up!'  
curl -s "${_BOXURL}/reboot.lua?sid=${_SID}&extern_reboot=1&ajax=1" >/dev/null  

back-to-topScript 6: Extrahieren von bestimmten Tags mit PHP (Kommentare im Code)
//shell-script ausführen
exec("/path/queryfritzbox.sh");  
//HTML-Dokument als DOM einlesen
$filePath = "test.html";  
$dom = new DOMDocument();
$dom->loadHTMLFile($filePath);
if ($dom){
	$xpath = new DOMXPath($dom);
	// Beispiel : Alle <div>-Tags mit der Klasse "test" mit XPath auslesen und ausgeben 
	$tags = $xpath->query('//div[@class="test"]');  
	foreach ($tags as $tag) {
		echo(trim($tag->nodeValue) . '<br />');  
	}
} else {
	echo "Konnte HTML-Datei nicht einlesen";  
}

back-to-topAktuelle Login-Methode für Boxen mit aktuellen 6.5er Firmware-Versionen
Da sich in den 6.5er Versionen das Interface etwas verändert hat hier ein Login-Update für diese Versionen
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s "${_BOXURL}/login_sid.lua?username=${_USERNAME}" | grep -Po '(?<=<Challenge>).*(?=</Challenge>)')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d "response=${_RESPONSE}&username=${_USERNAME}" "${_BOXURL}" | grep -Po -m 1 '(?<=sid=)[a-f\d]+')  

Weitere Lösungen für die unterschiedlichen Seiten der Fritz!Box werden folgen ...

Grüße @colinardo
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
back-to-topÜberarbeitungen
Datum Änderung
27.04.2016 Login-Methode für Firmware-Version 6.5X hinzugefügt
16.06.2015 Script zum Reboot der Box hinzugefügt
17.07.2014 Änderungen für Firmware 6.0X hinzugefügt
28.07.2013 Script zum Auslesen der Protfreigaben hinzugefügt
27.08.2013 Zu Beispiel 2: Information zur DSL-Resync-Anzahl in den letzten 24h hinzugefügt
27.08.2013 Script zum Auslesen des Syslog der Fritz!Box via Shell hinzugefügt.

Content-ID: 214598

Url: https://administrator.de/contentid/214598

Printed on: November 6, 2024 at 18:11 o'clock

aqui
aqui Aug 26, 2013, updated at Aug 31, 2013 at 14:19:33 (UTC)
Goto Top
Klasse Anleitung !
Lässt sich sicher auch für andere WebGUI basierte Router anwenden, oder ?

Link ist im Raspberry_Mgmt-Server_Tutorial eingepflegt face-wink
colinardo
colinardo Aug 26, 2013 at 09:05:23 (UTC)
Goto Top
Zitat von @aqui:
Klasse Anleitung !
Lässt sich sicher auch für andere WebGUI basierte Router anwenden, oder ?
Hi @aqui,
klar, man muss das Script halt an die Login-Methode des jeweiligen Herstellers anpassen. Dazu gibt es bereits einige Listen für Router im Web wie das mit curl auszusehen hat. Die Vorgehensweise nach dem Login ist ja die eigentliche Arbeit face-wink - mit Bash eine richtige Fusselsarbeit, da hat PHP in dieser Hinsicht schon seine Vorzüge, oder kennst du zufällig ein Tool für die Linux Kommandozeile mit dem sich ein HTML-DOM bequemer parsen lässt?

Grüße Uwe
aqui
aqui Aug 26, 2013 at 09:20:46 (UTC)
Goto Top
Als alter CLI Knecht (mit Rancid usw.) nicht wirklich... face-wink
DRwindows97
DRwindows97 Aug 26, 2013 at 12:52:42 (UTC)
Goto Top
Funktioniert das obige Skript auch unter Fritzboxen der 7360er Reihe ?
colinardo
colinardo Aug 26, 2013 updated at 12:56:26 (UTC)
Goto Top
Zitat von @DRwindows97:
Funktioniert das obige Skript auch unter Fritzboxen der 7360er Reihe ?
ausprobieren ! Hab hier keine Schublade mit allen Fritzboxen parat.
Kaputt machen kannst du damit nichts.
Grüße Uwe
DRwindows97
DRwindows97 Aug 26, 2013 at 12:58:41 (UTC)
Goto Top
Ok, ich werdes mal probieren.
colinardo
colinardo Aug 28, 2013 at 12:12:53 (UTC)
Goto Top
--- Update ---:
Habe noch zwei Scripte zum Auslesen des Syslog und der Portfreigaben hinzugefügt
face-wink Uwe
panguu
panguu Sep 28, 2014 updated at 13:20:57 (UTC)
Goto Top
Hi,

danke für die scripts. Ich wollte feedback hierzu geben, da ich das gerade ausprobieren wollte.

Im Ursprungsscript gibt's wohl 'nen Tippfehler, der zu einer Fehlermeldung führt. Das taucht in der letzten Zeile (11) auf, der redirect der Ausgabe sollte auf >$_OUTPUTFILE gehen, da fehlt bei dir noch ein 'T' face-smile

Dann wollte ich das zweite Skript ausprobieren, um DSL-Leitungsqualität auszulesen, jedoch schlägt das ebenso fehl (ich habe das Skript natürlich angepasst, weil ich >=OS6.x verwende). Wenn ich das Skript aufrufe erhalte ich:

awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
awk: line 1: syntax error at or near ,
Datenrate IN: kbit/s
Datenrate OUT: kbit/s
Latenz Empfangsrichtung: ms
Latenz Senderichtung: ms
Störabstandsmarge IN: db
Störabstandsmarge OUT: db
Leitungsdämpfung IN: db
Leitungsdämpfung OUT: db
DSL-Resync's (in 24h): mal

Grüße,
Pangu
colinardo
colinardo Sep 28, 2014 updated at 13:39:25 (UTC)
Goto Top
Hallo Pangu,
Zitat von @panguu:
Im Ursprungsscript gibt's wohl 'nen Tippfehler, der zu einer Fehlermeldung führt. Das taucht in der letzten Zeile
(11) auf, der redirect der Ausgabe sollte auf >$_OUTPUTFILE gehen, da fehlt bei dir noch ein 'T' face-smile
danke für die Rückmeldung ... ist oben korrigiert !
Dann wollte ich das zweite Skript ausprobieren, um DSL-Leitungsqualität auszulesen, jedoch schlägt das ebenso fehl (ich
habe das Skript natürlich angepasst, weil ich >=OS6.x verwende). Wenn ich das Skript aufrufe erhalte ich:
kann ich hier nicht bestätigen, ich habe es aber auch nur mit einer Fritz!Box 7390 mit Firmware 6.03 getestet, wie es mit der aktuellen 6.20 aussieht kann ich im Moment noch nicht sagen. Da kann sich immer mal was im Quellcode ändern, werde das bei Zeiten nachholen.

Ansonsten könnte es bei dir eher an der verwendeten awk-Version liegen, oder ein Zeichensatzfehler beim kopieren.

Grüße Uwe
aqui
aqui Sep 29, 2014 at 06:57:04 (UTC)
Goto Top
Mit apt-get install gawk auf einem RasPi funktioniert es wunderbar face-wink
panguu
panguu Sep 29, 2014 at 07:50:34 (UTC)
Goto Top
ich hatte "mawk" auf meinem RPi installiert, und damit ging's nicht. Müsste man evtl. den syntax anpassen, aber hab jetzt nicht groß danach geschaut. Mit dem angesprochenen "gawk" spuckt er schonmal keine Fehlermeldung aus, das klappt also. Allerdings krieg ich keine Werte zurückgeliefert, aber das kann wiederum daran liegen, dass das Script mit meiner FritzBox 6340 Cable nicht will, oder meine Firmware einfach ein klein wenig anders ist und das Script hierzu nicht passt.
colinardo
colinardo Sep 29, 2014 updated at 08:04:16 (UTC)
Goto Top
Zitat von @panguu:
ich hatte "mawk" auf meinem RPi installiert, und damit ging's nicht. Müsste man evtl. den syntax anpassen,
aber hab jetzt nicht groß danach geschaut. Mit dem angesprochenen "gawk" spuckt er schonmal keine Fehlermeldung
aus, das klappt also. Allerdings krieg ich keine Werte zurückgeliefert, aber das kann wiederum daran liegen, dass das Script
mit meiner FritzBox 6340 Cable nicht will, oder meine Firmware einfach ein klein wenig anders ist und das Script hierzu nicht
passt.
yip das wird's sein musst du den HTML-Quellcode studieren, und dich ein bißchen in gawk einlesen face-wink
TimoMF
TimoMF Jun 15, 2015 at 11:25:04 (UTC)
Goto Top
Das erste Script funktioniert auch auf der Fritz!BOX 7490 schon mal danke dafür.

Ich bin ansich auf der Suche nach einem Script welches die Fritzbox neu zu starten. Den über Telnet möchte ich das nicht machen, da die Box dem Provider gehört.

Leider bekomme ich das nicht hin.

im Quellcode finde ich da leider nichts was

<p>Klicken Sie hier, wenn Sie die FRITZ!Box neu starten wollen.</p>
<h4>Hinweis:</h4>
<p>Beim Neustart werden die Ereignismeldungen gelöscht. Alle Einstellungen der FRITZ!Box bleiben erhalten.</p>
<form action="/system/reboot.lua" method="POST">
<div id="btn_form_foot">
<input type="hidden" name="sid" value="577250e1160a0143">
<button type="submit" name="reboot">Neu starten</button>
</div>
</form>

Nachdem was ich da sehe müste die curl zeile doch so aussehen oder?

curl -s "${_BOXURL}${_REQUESTPAGE}" -d "sid=${_SID}" -d "reboot=Neu%20starten" >$_OUTPUTFILE

leider gibt die Fritz!box dann nichts zurück die output.html beibt leer.
Was mache ich da falsch?
colinardo
colinardo Jun 15, 2015 updated at 12:04:04 (UTC)
Goto Top
Hallo erstmal @TimoMF und willkommen auf Administrator.de!
Das geht deshalb nicht weil der Reboot mit der Unterstützung von JavaScript und Ajax initiiert wird, bzw mit JavaScript eine xhr-id generiert wird mit welcher dann ein weiterer GET-Request an die Seite gesendet wird.
Muss ich mir mal die JavaScripts ansehen ob sich da was machen lässt.

Grüße Uwe
TimoMF
TimoMF Jun 16, 2015 at 16:43:37 (UTC)
Goto Top
Das wäre sehr nett von dir.

Dann drücke ich mal die Daumen das es Klappt.
colinardo
colinardo Jun 16, 2015 updated at 18:08:50 (UTC)
Goto Top
Kaum hat man mal die LUA-Scripte via Telnet auf der Box studiert, schon fällt einem die Lösung in die Hände face-big-smile, hätte ich auch gleich drauf kommen können , oh man.
Es reicht ein einfacher GET mit Curl und den richtigen Parametern...
back-to-topReboot Fritz!Box (getestet mit einer 7390 und Firmware 6.23)
(Bitte beachte das der obige Code auch etwas angepasst wurde, da unsichtbare Zeichen in der SID Probleme gemacht haben)
#!/bin/bash
_BOXURL="http://fritz.box"  
_USERNAME=""  
_PASSWORD="GEHEIM"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE=${_CHALLENGE}"-"${_MD5}  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d "username=${_USERNAME}" "${_BOXURL}/login.lua" | grep "Location:" | awk -F'=' '{print $NF}' | grep -Po '[a-f\d]+')  

# Box rebooten
echo 'Reboot in progress ... please allow up to 2 minutes for the box to come up!'  
curl -s "${_BOXURL}/reboot.lua?sid=${_SID}&extern_reboot=1&ajax=1" >/dev/null  
p.s. und ja, der Pfad /reboot.lua ist korrrekt, denn es gibt zwei dieser Scripte, einmal im root und einmal unter /system.

Nun viel Spaß beim rebooten
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
TimoMF
TimoMF Jun 16, 2015 updated at 20:15:00 (UTC)
Goto Top
Vielen Dank dir.

Mei der Fritz!BOX 7490 Firmware 6.20. Die Firmware ist die Aktuelle vom Provider freigegebene Version.

Ich Poste auch noch im anderem Post damit auch die jenigen die nach der 7490 suchen es finden.
Fals es lieber in den Haubtpost soll dort soll dann bitte meinen Post löschen.

Griß Timo
aqui
aqui Jun 17, 2015 at 07:57:56 (UTC)
Goto Top
How can I mark a post as solved?
dann nicht vergessen....
colinardo
colinardo Jun 17, 2015 updated at 08:43:48 (UTC)
Goto Top
Zitat von @aqui:
How can I mark a post as solved?
dann nicht vergessen....
Hallo @aqui, wenn ich das nur könnte, aber das ist eine Anleitung face-smile

Grüße Uwe
LloidIrvyng
LloidIrvyng Dec 13, 2015 at 20:28:03 (UTC)
Goto Top
Hi Uwe,

vielen Dank für die Veröffentlichung. In diesem Zuge gibt als Dankeschön auch gleich etwas zurück. Mit dem unten angehängten Skript ist es möglich, einen Computer via Wake-on-LAN aufzuwecken. Bei der Fritz!Box gibt es da den bekannten Button "Computer starten". Mein Grund ist folgender: Ich greife ab und zu auf meinen Router aus der Ferne zu und muss einen Rechner, welcher in dem Netz hängt, aufwecken. Bei meiner Fritz!Box (Fritz!Box 6320) ist es jedoch nicht ohne weiteres möglich, das Magic Packet über einen freigegeben Port zu broadcasten. Falls man natürlich schon direkt am Netzwerk hängt, bringt das Skript natürlich keinen wirklichen Mehrwert - da ist beispielsweise etherwake unter Linux bequemer.

Ich habe das Ganze unter Windows 10 und Debian 9 getestet. Sollte es nicht funktionieren, so sollte zuerst überprüft werden, ob der Rechner auch korrekt konfiguriert wurde und im Netzwerk via LAN verbunden ist. Je nach Einsatzgebiet könnte man das Skript natürlich noch erweitern.

Beste Grüße: Lloid Irvyng


#!/bin/bash

_BOXURL="192.168.178.1"  
_USERNAME=""  
_PASSWORD="MEIN-PASSWORT"  
_MAC="FF:FF:FF:FF:FF:FF"  
_CHALLENGE=$(curl -s ${_BOXURL}/login.lua | grep "^g_challenge" | awk -F '"' '{ print $2 }')  
_MD5=$(echo -n ${_CHALLENGE}"-"${_PASSWORD} | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}')  
_RESPONSE="${_CHALLENGE}-${_MD5}"  
_SID=$(curl -i -s -k -d 'response='${_RESPONSE} -d 'page=' -d 'username='${_USERNAME} ${_BOXURL}/login.lua | grep "Location:" | awk -F'=' '{print $NF}' | grep -Po '[a-f\d]+')  

_PAGE_NETWORK_LIST=$(curl -s "${_BOXURL}/net/network_user_devices.lua" -d 'sid='${_SID})  
_RULES=$(echo "$_PAGE_NETWORK_LIST" | awk  'match($0, /\[\"UID\"\] = \"(.*)\"/, arr){line = arr[1]};match($0, /\[\"_node\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"ip\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"mac\"\] = \"(.*)\"/, arr){line = line"#"arr[1]};match($0, /\[\"name\"\] = \"(.*)\"/, arr){line = line"#"arr[1]; print line; line =""};')   


SEARCH_LINE=$(echo -e "\n $_RULES" | column -t | grep $_MAC)  
if [ -n "$SEARCH_LINE" ]; then  
	#echo "Found MAC address in network, continue ..." 

	IFS='#' read -r -a array <<< "$SEARCH_LINE"  
	DEVICE_UID="${array}"  
	DEVICE_NODE="${array[1]}"  
	DEVICE_IP="${array[2]}"  
	DEVICE_MAC="${array[3]}"  
	DEVICE_NAME="${array[4]}"  
   else
	echo "Sorry, could not find $_MAC in your network."  
	exit 1
fi

# Sending magic packet to device ...
echo "Sending magic packet to $DEVICE_MAC ($DEVICE_NAME) ..."  
curl --data "plc_desc=$DEVICE_NAME&dev_name=$DEVICE_NAME&btn_wake=&back_to_page=/net/network_user_devices.lua&dev=$DEVICE_UID" "$_BOXURL/net/edit_device.lua?sid=$_SID"  
netzdompteur
netzdompteur Feb 28, 2016 at 20:22:47 (UTC)
Goto Top
Die Scripte sind ausgezeichnet. Ich beschäftige mich gerade mit den Portfreigaben.
Das Script4 zeigt schön, wie das geht, die Einstellungen auszulesen.
Nur hätte ich gerne, das ich auch Portfreigaben setzen kann bzw. vorhandene Portfreigaben aktivieren und deaktivieren kann.
Als Anregung hatte ich das Script Wake-OnLAN im Auge, wo zumindest die letzten Curl-Zeilen in abgewandelter Form verwendbar sein sollten.
Nur habe ich das nicht hinbekommen, wie der Post genau aussehen muss bzw. wie das mit CURL aussehen muss.
So viel habe ich rausgekriegt, das ein POST mit diesen Parametern gesendet wird:


active_1=1
active_2=1
active_3=1
active_5=1
sid=d9a82535766a23a3
apply

Aktivert Regel 1-3 und 5

active_1=1
active_2=1
active_5=1
sid=d9a82535766a23a3
apply

Deaktiviert die Regel 3 wieder.

Das Ganze wird dann wohl so geschickt:
curl --data "$_BOXURL/internet/port_fw.lua?sid=$_SID  .....?  

Eine andere Option ist, die Regel komplett zu setzen. Dann sehen die Postdaten so aus:

current_rule=rule5
is_new_rule=true
was_exposed_host=false
forwardrules_rule5_activated=1
selected_app=other
forwardrules_rule5_description=RemoteAccess
forwardrules_rule5_protocol=TCP
forwardrules_rule5_port=80
forwardrules_rule5_endport=80
selected_lan_device=manuell#manuell
forwardrules_rule5_fwip=10.174.110.120
forwardrules_rule5_fwport=80
sid=d9a82535766a23a3
rule=rule5
apply

Wie könnte da der Aufruf mit CURL aussehen ?
Dann fehlt nur noch, wie man die Portfreigabe wieder löscht.

Hat hier jemand eine Idee oder Hinweis ?
netzdompteur
netzdompteur Feb 28, 2016 at 21:48:04 (UTC)
Goto Top
Kaum hat man mal das Problem niedergeschrieben, so kommt man auf die richtigen Tools und Lösung:

Der Aufruf muss so aussehen:

 curl -s "$_BOXURL/internet/port_fw.lua" -d "active_1=1&active_2=1&active_3=1&active_5=1&sid=$_SID&apply="  

Rausbekommen mit Firebug, der wunderschön die Daten ausgibt, was im Post steht.
colinardo
colinardo May 02, 2016 updated at 13:21:33 (UTC)
Goto Top
back-to-top---> Update
Login Methode für Firmware 6.5x hinzugefügt

Für alle die es interessiert. ich habe eine neue Anleitung für das Steuern der FritzBox mit Powershell und dem TR-064 Protokoll verfasst:

Powershell: FritzBox über TR-064 im Netzwerk konfigurieren und auslesen

Grüße Uwe