7390 Telefonbuch per Shell-Script auslesen geht nicht mehr

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,534
Punkte für Reaktionen
34
Punkte
48
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?
 

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
12,047
Punkte für Reaktionen
718
Punkte
113
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.
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,534
Punkte für Reaktionen
34
Punkte
48
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.
 

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
12,047
Punkte für Reaktionen
718
Punkte
113
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).
 

koyaanisqatsi

IPPF-Urgestein
Mitglied seit
24 Jan 2013
Beiträge
11,145
Punkte für Reaktionen
176
Punkte
63
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>
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,534
Punkte für Reaktionen
34
Punkte
48
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:

PeterPawn

IPPF-Urgestein
Mitglied seit
10 Mai 2006
Beiträge
12,047
Punkte für Reaktionen
718
Punkte
113
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:
 

Theo Tintensich

Aktives Mitglied
Mitglied seit
10 Mrz 2008
Beiträge
1,534
Punkte für Reaktionen
34
Punkte
48

3PO

Neuer User
Mitglied seit
3 Jun 2005
Beiträge
147
Punkte für Reaktionen
3
Punkte
18
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?
 

3PO

Neuer User
Mitglied seit
3 Jun 2005
Beiträge
147
Punkte für Reaktionen
3
Punkte
18
Danke, das Problem ist nur, dass ich kein PHP kann.
 

3PO

Neuer User
Mitglied seit
3 Jun 2005
Beiträge
147
Punkte für Reaktionen
3
Punkte
18
Hat erledigt, ich habe meinen Fehler gefunden. :)
 

3CX PBX - GRATIS
Linux / Win / Cloud

Statistik des Forums

Themen
232,039
Beiträge
2,018,142
Mitglieder
349,322
Neuestes Mitglied
fensterrahmen