file upload shell backend (как принять файл в cgi-скрипте?)

Модератор: Модераторы разделов

Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

file upload shell backend

Сообщение DimkaS »

Есть железка на арме под линухом. Есть простейший веб-интерфейс на шелле. Нужно организовать загрузку файла в устройство через браузер. CGI-скрипт получает такой набор переменных:

Код: Выделить всё

AUTH_TYPE='Basic'
CONTENT_LENGTH='357'
CONTENT_TYPE='multipart/form-data; boundary=---------------------------10756947078936209661531891019'
GATEWAY_INTERFACE='CGI/1.1'
HTTP_REFERER='http://192.168.1.1/cgi-bin/update.cgi'
HTTP_USER_AGENT='Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.12) Gecko/20080208 (Debian-1.8.1.12-2) Epiphany/2.14'
IFS=' '
PATH='/bin:/usr/bin:/etc:/sbin:/usr/sbin'
PATH_INFO=''
POST_STRING='-----------------------------10756947078936209661531891019 '
PPID='19119'
PS1='# '
PS2='> '
PS4='+ '
PWD='/home/httpd/cgi-bin'
QUERY_STRING=''
REMOTE_ADDR='192.168.1.10'
REMOTE_PORT='45489'
REMOTE_USER='root'
REQUEST_METHOD='POST'
REQUEST_URI='/cgi-bin/update_exec.cgi'
SCRIPT_FILENAME='/home/httpd/cgi-bin/update_exec.cgi'
SCRIPT_NAME='/cgi-bin/update_exec.cgi'
SERVER_PROTOCOL='HTTP/1.0'
SERVER_SOFTWARE='busybox httpd/1.9.0'

Вопрос - как получить файл?
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: file upload shell backend

Сообщение KiWi »

Разбирать либо

Код: Выделить всё

CONTENT_TYPE='multipart/form-data; boundary=---------------------------10756947078936209661531891019'

либо

Код: Выделить всё

POST_STRING='-----------------------------10756947078936209661531891019 '
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

А что это?
Эта строка постоянно меняется, даже если загружать один и тот же файл. Но она слишком короткая, чтоб в ней могло быть реальное содержимое.
Я, честно, пока вообще не понимаю, как именно происходит загрузка файла. Делает ли вёб-сервер всё сам, или же мне нужно запустить какую-то утилиту, чтоб принять файл?
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: file upload shell backend

Сообщение un-defined »

Для передачи используется, судя по всему, метод POST. А что говорит спецификация POST в HTTP по этому поводу?
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

Я внимательно прочитал http://www.ietf.org/rfc/rfc1867.txt, но всё равно мало что понял...
Есть такое предположение - присылаемая форма должна выглядеть примерно так:

Код: Выделить всё

Content-type: multipart/form-data, boundary=AaB03x

        --AaB03x
        content-disposition: form-data; name="field1"

        Joe Blow
        --AaB03x
        content-disposition: form-data; name="pics"; filename="file1.txt"
        Content-Type: text/plain

         ... contents of file1.txt ...
        --AaB03x--

Т.е. разделена символами перевода строки. Может, echo $POST_STRING выдаёт мне только первую строку? Как тогда получить полное содержимое?
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

Wireshark показал, что присылаемая форма выглядит так, как должна и содержимое файла в ней есть, но...
http://osdir.com/ml/busybox/2003-09/msg00064.html
> > > can anybody give me a hint if the Busybox httpd is capable of
> > > handling file uploads? Is "multipart/form-data" handled correctly?
> >
> > Unsupport.


Попробую http://www.kessels.com/Upload/. Если не выйдет, придётся менять сервер.
Спасибо сказали:
phprus
Сообщения: 42
ОС: OpenSuSE

Re: file upload shell backend

Сообщение phprus »

В случае если Content-type является multipart/form-data (а при загрузке файлов это всегда так), то echo $POST_STRING выводит поле boundary из заголовка Content-type. По этому значению будет необходимо разбивать POST-данные для получения отдельных полей запроса.

А само тело POST-запроса должно передаваться скрипту на стандартный ввод.
Спасибо сказали:
un-defined
Сообщения: 145
ОС: Kubuntu, Gentoo

Re: file upload shell backend

Сообщение un-defined »

Есть еще кстати метод PUT...
Don`t try - just do or do not ©Master Joda
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

phprus писал(а):
24.04.2008 18:58
А само тело POST-запроса должно передаваться скрипту на стандартный ввод.


Точно! У меня в скрипте был один read, а их надо было много сделать, чтоб весь входящий поток построчно прочитать. Спасибо!
Осталось разобраться, как вытащить пришедший бинарник.
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

Новая проблема: конструкция read + echo съедает некоторые символы из бинарника. Даж не знаю, что и делать. Ваять прогу на Си что-то не хочется...
Вот мой скрипт:

Код: Выделить всё

#!/bin/sh

# html starts
echo "Content-type: text/html"
echo ""

echo "Please wait..."

#get separation string
read BOUNDARY

#remove header
read STRING
read STRING
read STRING

#get content
rm /tmp/update
while true; do
        read STRING
        if [  "$STRING" = "$BOUNDARY" ]; then
                break
        fi
        echo "$STRING" >> /tmp/update
done

echo "<meta http-equiv=\"refresh\" content=\"1;url=update.cgi\"/>"
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

бинарник вместе со всеми заголовками загнал в файл при помощи tee. Осталось придумать как убрать заголовки:

Код: Выделить всё

-----------------------------20094318444587480601864637482
Content-Disposition: form-data; name="firmware"; filename="at91_serial_fixup.tar.gz"
Content-Type: application/x-gzip

... здесь идёт бинарник ...
-----------------------------20094318444587480601864637482
Content-Disposition: form-data; name="update"

Update
-----------------------------20094318444587480601864637482--

Важно не забыть выкинуть символы переноса строки.
Спасибо сказали:
Аватара пользователя
DimkaS
Сообщения: 146
ОС: Debian Testing

Re: file upload shell backend

Сообщение DimkaS »

Проблема с tee - байты 0x00 заменяются на 0x0A. Надо искать что-то другое...
Верхний заголовок убрал с помощью sed -n '1,4d;p'
Для нижнего пока вариант sed '$d' раз 5 подряд.

+++
Виновата не tee, а sed и я. Конечное решение:

Код: Выделить всё

tee > update.file
sed '1,4d' update.file |sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d'|sed '$d' > update.tar.gz


+++
так короче:
sed '1,4d;$d;$d;$d;$d;$d;$d;' - | tar xf - -C /tmp
Спасибо сказали: