7390 Telefonbuch per Shell-Script auslesen geht nicht mehr

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
2,223
Punkte für Reaktionen
106
Punkte
63
Hallo,

ich habe ein Shellscript, das regelmäßig das Telefonbuch meiner 7390 auslesen soll. Seit der FW 6.51 geht das aber nicht mehr.
Es gibt, bei der Ausführung des Scriptes, aber auch keine Fehlermeldung.

Das Script:
Code:
#!/bin/bash
# Telefonbuch der Fritzbox in XML-Datei auslesen
PATH=/usr:/usr/bin:/bin
ziel_pfad=/var/www/html/telefon
ziel_datei=FRITZ.xml

# FritzBox credentials
_FBOX="http://fritz.box"
_USERNAME=""
_PASSWORD="abc123"
_PhonebookId="0"
_PhonebookExportName="Telefonbuch"

# get challenge key from FB
_CHALLENGE=$(curl -s \
                  -k \
                  "${_FBOX}/login.lua" | \
              grep "^g_challenge" | \
              awk -F'"' '{ print $2 }')


# build md5 from challenge key and password
_MD5=$(echo -n \
            ${_CHALLENGE}"-"${_PASSWORD} | \
        iconv -f ISO8859-1 \
              -t UTF-16LE | \
        md5sum -b | \
        awk '{print substr($0,1,32)}')

# assemble challenge key and md5
_RESPONSE=${_CHALLENGE}"-"${_MD5}

# get sid for later use
_SID=$(curl -i \
            -s \
            -k \
            -d 'response='${_RESPONSE} \
            -d 'page=' \
            -d 'username='${_USERNAME} \
            ${_FBOX}/login.lua | \
        grep "Location:" | \
        awk -F'=' {' print $NF '})

# get configuration from FB and write to STDOUT
curl -s \
     -k \
     --form 'sid='${_SID} \
     --form 'PhonebookId='${_PhonebookId} \
     --form 'PhonebookExportName='${_PhonebookExportName} \
     --form 'PhonebookExport=' \
     ${_FBOX}/cgi-bin/firmwarecfg \
     -o ${ziel_pfad}/${ziel_datei}

Das Script ist nach wenigen Sekunden (nicht einmal zwei, oder so) Fertig. Die Zieldatei wird nicht geschrieben/verändert. (Dann wäre mir das früher aufgefallen)

Ruft man das mit "bash -x script.sh" auf, bekommt man das folgende als Ausgabe:
Code:
+ PATH=/usr:/usr/bin:/bin
+ ziel_pfad=/var/www/html/telefon
+ ziel_datei=FRITZ.xml
+ _FBOX=http://fritz.box
+ _USERNAME=
+ _PASSWORD=abc123
+ _PhonebookId=0
+ _PhonebookExportName=Telefonbuch
++ awk '-F"' '{ print $2 }'
++ grep '^g_challenge'
++ curl -s -k http://fritz.box/login.lua
+ _CHALLENGE=
++ md5sum -b
++ awk '{print substr($0,1,32)}'
++ echo -n -abc123
++ iconv -f ISO8859-1 -t UTF-16LE
+ _MD5=043d1dcf791db2969cf0f2508d9e5dec
+ _RESPONSE=-043d1dcf791db2969cf0f2508d9e5dec
++ awk -F= '{ print $NF }'
++ grep Location:
++ curl -i -s -k -d response=-043d1dcf791db2969cf0f2508d9e5dec -d page= -d username= http://fritz.box/login.lua
' _SID='Location: http://fritz.box/
+ curl -s -k --form sid=Location: $'http://fritz.box/\r' --form PhonebookId=0 --form PhonebookExportName=Telefonbuch --form PhonebookExport= http://fritz.box/cgi-bin/firmwarecfg -o /var/www/html/telefon/FRITZ.xml

Irgendwie irritiert mich das - vor dem Password "abc123" in der Zeile "echo -n -abc123"
Das Script lief, ohne Änderung, bis zum 29.9.2016 wie gewünscht, an dem folgenden Tag hat sich die F!B die aktuelle FW geholt.

Irgend ein Vorschlag?
 
Die extrahierte SID ist ja ganz offensichtlich keine ... also funktioniert wohl das Login nicht mehr auf diesem Wege bzw. das Extrahieren der Daten sollte man dann doch besser mit "xmllint" machen, dann bleiben auch (marginale) Änderungen an der XML-Struktur ohne Folgen.
 
Es sieht so aus, als wenn
Code:
# get challenge key from FB
_CHALLENGE=$(curl -s \
                  -k \
                  "${_FBOX}/login.lua" | \
              grep "^g_challenge" | \
              awk -F'"' '{ print $2 }')
eine Antwort von der F!B bekommt,
denn bei
Code:
++ awk '-F"' '{ print $2 }'
++ grep '^g_challenge'
++ curl -s -k http://fritz.box/login.lua
+ _CHALLENGE=
ist "_CHALLENGE" ja leer.
 
Vielleicht habe ich das nicht deutlich genug ausgedrückt ... die "richtige" Seite ist "login_sid.lua" und die liefert dann XML-Daten - ganz so, wie es seit mindestens vier Jahren schon bei AVM beschrieben ist (den Abschnitt für Firmware ab 05.50 lesen).
 
Moin


Mit der (login_sid.lua) lässt sich übrigens auch prüfen, ob eine SID gültig ist und welche Rechte der Benutzer hat.

Beispiel für die Adresszeile eines Webbrowsers
Code:
 http://fritz.box/login_sid.lua?sid=2d93c6b63a3626ea
...liefert, wenn gültig, so eine XML zurück...
HTML:
<?xml version="1.0" encoding="utf-8"?>
<SessionInfo>
<SID>2d93c6b63a3626ea</SID>
<Challenge>8f6d9a18</Challenge>
<BlockTime>0</BlockTime>
<Rights>
<Name>Dial</Name>
<Access>2</Access>
<Name>App</Name>
<Access>2</Access>
<Name>HomeAuto</Name>
<Access>2</Access>
<Name>BoxAdmin</Name>
<Access>2</Access>
<Name>Phone</Name>
<Access>2</Access>
<Name>NAS</Name>
<Access>2</Access>
</Rights>
</SessionInfo>
 
So, nachdem ich einem doofen Fehler gefunden habe, habe ich es jetzt wieder hinbekommen.
Code:
#!/bin/bash
# Telefonbuch der Fritzbox in XML-Datei auslesen
set -x
PATH=/usr:/usr/bin:/bin
ziel_pfad=/var/www/html/telefon
ziel_datei=FRITZ.xml

# FritzBox credentials
_FBOX="fritz.box"
Passwd="abc123"
_PhonebookId="0"
_PhonebookExportName="Telefonbuch"

# get challenge key from FB
Challenge=`wget -O - "http://${_FBOX}/login_sid.lua" 2>/dev/null | sed 's/.*<Challenge>\(.*\)<\/Challenge>.*/\1/'`

# login aufbauen und hashen
CPSTR="$Challenge-$Passwd"
MD5=`echo -n $CPSTR | iconv -f ISO8859-1 -t UTF-16LE | md5sum -b | awk '{print substr($0,1,32)}'`
RESPONSE="$Challenge-$MD5"
POSTDATA="?username=&response=$RESPONSE"

# login senden und SID herausfischen
_SID=`wget -O - --post-data="$POSTDATA" "http://${_FBOX}/login_sid.lua" 2>/dev/null | sed 's/.*<SID>\(.*\)<\/SID>.*/\1/'`

# get configuration from FB and write to STDOUT
curl -s \
     -k \
     --form 'sid='${_SID} \
     --form 'PhonebookId='${_PhonebookId} \
     --form 'PhonebookExportName='${_PhonebookExportName} \
     --form 'PhonebookExport=' \
     http://${_FBOX}/cgi-bin/firmwarecfg \
     -o ${ziel_pfad}/${ziel_datei}

Mit der Hauptfehler war, dass ich in der Variablen _FBOX nicht nur "fritz.box", sondern "http://fritz.box" stehen hatte.
(Schon oben in meinem ersten Post ;-)
So wurde keine SID ermittelt, da beim Aufruf "http://http://fritz.box" stand....
 
Zuletzt bearbeitet:
So, nachdem ich einem doofen Fehler gefunden habe, habe ich es jetzt wieder hinbekommen.
[...]
Mit der Hauptfehler war, dass ich in der Variablen _FBOX nicht nur "fritz.box", sondern "http://fritz.box" stehen hatte.
(Schon oben in meinem ersten Post ;-)
So wurde keine SID ermittelt, da beim Aufruf "http://http://fritz.box" stand....
Und das kam jetzt vom Update des FRITZ!OS?
Theo Tintensich schrieb:
Seit der FW 6.51 geht das aber nicht mehr.
:gruebel:
 
Hallo,

ich möchte jetzt nicht zu sehr OT werden, aber wie müsste denn der Befehl lauten, wenn man ein Telefonbuch auf die FB zurückschreiben will?
 
Danke, das Problem ist nur, dass ich kein PHP kann.
 
Hat erledigt, ich habe meinen Fehler gefunden. :)
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.