POST-Daten mit Sh-CGI-Script verarbeiten.

joha.ma

Neuer User
Mitglied seit
9 Apr 2007
Beiträge
13
Punkte für Reaktionen
0
Punkte
1
Hallo

Ich möchte mir gern mit /bin/sh eigene CGI-Scripts für den FritzBox-Webserver schreiben. Dafür hab ich auch Anleitungen gefunden:

http://mailman.sil.at/pipermail/cd/2002-March/000076.html
http://rcswww.urz.tu-dresden.de/~petrick/help/cgi.html

Probleme machen allerdings POST-Aufrufe:
Der Server definiert einen Satz Environment Variablen und ruft dann das Programm auf. Die für einfache Anwendungen wichtigsten Variablen sind:

REQUEST_METHOD
Bei Methode GET werden alle Argumente in der Variablen QUERY_STRING übergeben. POST übergibt die Daten an der Standardeingabe.
CONTENT_LENGTH
Nur bei POST, Länge des Datenstroms in Byte.
Die übergebenen Parameter sind möglicherweise URL-encoded und werden in Abhängigkeit von der Methode POST oder GET entweder in der Variablen QUERY_STRING oder über die Standardeingabe übergeben. Der einfachste Weg damit fertig zu werden ist das Hilfsprogramm cgiparse. Der Aufruf cgiparse -form setzt die Variablen FORM_<name>.

Jetzt habe ich das Problem, CONTENT_LENGTH Zeichen aus Stdin lesen zu müssen. Wie mache ich das am einfachsten. /dev/stdin existiert nicht, zumal ich das Auslesen auch schlecht beschänken könnte. Und um mir cgiparse (http://www-wireless.usenet-replayer.com/data/fido/ger/linux/25234.html) zu kompilieren bin ich zu blöd.
 
Alternativen?:
Es geht wohl auch Perl mit der Box: http://www.ip-phone-forum.de/showthread.php?t=114888
Und Apache mit PHP soll auch laufen...

Zum andern:
stdin liest man in der Shell mit
read variable
Wüsste nicht, wie man da Länge begrenzen könnte, es wird wohl bis zum ENTER gelesen...
oder danach dann kürzen...?
Vielleicht hilft dir das?
 
Ich habe eine FritzBox SL, da siehts mit Perl oder PHP platzmäßig schlecht aus. Sie hat auch kein wget und ich hab es noch nicht geschaft einen FTP-Server in das Telnet-Image einzubetten. (Telnet hat sie übrigens auch kein eigenes) Ich erhalte immer die Meldung: Ein nicht näher spezifizierter Fehler ist aufgetreten. Naja

Das mit read Variable funktioniert gut, aber es wird nur eine Zeile gelesen.
Man müsste read in eine Schleife setzen, die abbricht, wenn CONTENT-LENGTH Zeichen gelesen wurden. Wie das gehen soll weiss ich aber nicht.
 
Hallo,

ungefähr so:

Code:
# create urldecode.sed
cat > /var/tmp/urldecode.sed << 'ENDURLDECODE'
s/+/ /g
s/%09/	/g
s/%0A/\n/g
s/%0D//g
s/%20/ /g
s/%21/!/g
s/%22/"/g
s/%23/#/g
s/%24/\$/g
s/%25/%/g
s/%26/\&/g
s/%27/'\''/g
s/%28/(/g
s/%29/)/g
s/%2A/\*/g
s/%2B/+/g
s/%2C/,/g
s/%2D/-/g
s/%2E/\./g
s/%2F/\//g
s/%3A/:/g
s/%3B/;/g
s/%3C/</g
s/%3D/=/g
s/%3E/>/g
s/%3F/?/g
s/%40/@/g
s/%5B/\[/g
s/%5C/\\/g
s/%5D/\]/g
s/%5E/\^/g
s/%5F/_/g
s/%60/`/g
s/%7B/{/g
s/%7C/|/g
s/%7D/}/g
s/%7E/~/g
s/%91/`/g
s/%92/&acute;/g
ENDURLDECODE

read -r post_data
split_data=`echo $post_data | sed -e 's/&/ /g'`

for var in $split_data; do
   output=`echo ${var} | sed -f /var/tmp/urldecode.sed`
   echo $output
done
 
Wenn's auch 25 KB auf der Box sein dürfen, empfehle ich Haserl.
 
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.