nixp.ru v3.0

28 мая 2017,
воскресенье,
15:15:20 MSK

DevOps с компанией «Флант»
Аватар пользователя DimkaS
DimkaS написал 21 апреля 2008 года в 17:48 (472 просмотра) Ведет себя как мужчина; открыл 84 темы в форуме, оставил 922 комментария на сайте.

Есть железка на арме под линухом. Есть простейший веб-интерфейс на шелле. Нужно организовать загрузку файла в устройство через браузер. 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'

Вопрос — как получить файл?

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 content=«\"1;url=update.cgi\"/»>

"
Anarchist

Насколько я знаю shell, для таких задач он подходит далеко не лучшим образом.

С С ты загнул… А вот на что-нибудь типа Perl’а ИМХО посмотреть стоит.

rgo

А если вместо `while true; …’, написать

grep -v "$BOUNDARY" >>/tmp/update


что будет?

[upd]

А, не получится. grep зависнет. но grep можно заменить awk’ом…

DimkaS

Anarchist, запихивать в эту железку perl ради только одной функции очень неохота.

rgo, попробую

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--

Важно не забыть выкинуть символы переноса строки.

Anarchist

sed наличествует?

DimkaS

Да, sed есть, верхний заголовок уже убрал. Проблема с tee — байты 0×00 заменяются на 0×0A. Надо искать что-то другое…

DimkaS

Виновата не 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