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.
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.
Im Beispiel wird alles zwischen diesen Tags ausgelesen:
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)
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
Steht man vor der Aufgabe bestimmte Informationen der Fritz!Box automatisiert abzufragen, hilft euch vielleicht dieses Script weiter.
Das 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 sollShell-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.
Beispiele
Script 1: Ausfiltern des Inhalts eines HTML-Tags mit GREP auf der Kommandzeile
cat OUTPUT.html | tr -d '\n' | grep -oP '(?<=<table id="test">).*?(?=</table>)'
<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.Beispiel 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"
#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]};')
Script 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"
Script 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 "#"
Script 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
Script 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";
}
Aktuelle 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
Ü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. |
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 214598
Url: https://administrator.de/tutorial/informationen-aus-dem-webinterface-einer-fritzbox-via-shellscript-auslesen-214598.html
Ausgedruckt am: 21.12.2024 um 15:12 Uhr
23 Kommentare
Neuester Kommentar
Klasse Anleitung !
Lässt sich sicher auch für andere WebGUI basierte Router anwenden, oder ?
Link ist im Raspberry_Mgmt-Server_Tutorial eingepflegt
Lässt sich sicher auch für andere WebGUI basierte Router anwenden, oder ?
Link ist im Raspberry_Mgmt-Server_Tutorial eingepflegt
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'
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:
Grüße,
Pangu
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'
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
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
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.
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?
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?
Wie kann ich einen Beitrag als gelöst markieren?
dann nicht vergessen....
dann nicht vergessen....
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
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"
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:
Aktivert Regel 1-3 und 5
Deaktiviert die Regel 3 wieder.
Das Ganze wird dann wohl so geschickt:
Eine andere Option ist, die Regel komplett zu setzen. Dann sehen die Postdaten so aus:
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 ?
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 ?
Kaum hat man mal das Problem niedergeschrieben, so kommt man auf die richtigen Tools und Lösung:
Der Aufruf muss so aussehen:
Rausbekommen mit Firebug, der wunderschön die Daten ausgibt, was im Post steht.
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.