CGI: обработка POST bash-ем (возникает Segmentation fault)

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

IMB
Сообщения: 2567
ОС: Debian

CGI: обработка POST bash-ем

Сообщение IMB »

Доброго дня!
Нашёл данную ссылку http://digitalmechanic.wordpress.com/2008/...sh-cgi-scripts/ с описанием того, как передать данные по POST в bash-скрипт.
скрипт

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

#!/bin/sh
POST_DATA=$(</dev/stdin)
#echo "${POST_DATA}"
echo "Status: 200 OK"
echo "test"

При его запуске в консоле получаю следующий вывод:

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

Segmentation fault
Status: 200 OK
test

Системные устройства

user

ls -l /dev/std* lrwxrwxrwx 1 root root 15 Aug 3 2010 /dev/stderr -> /proc/self/fd/2 lrwxrwxrwx 1 root root 15 Aug 3 2010 /dev/stdin -> /proc/self/fd/0 lrwxrwxrwx 1 root root 15 Aug 3 2010 /dev/stdout -> /proc/self/fd/1 ls -l /proc/self/fd/ lrwx------ 1 root root 64 Jan 1 08:31 0 -> /dev/console lrwx------ 1 root root 64 Jan 1 08:31 1 -> /dev/console lrwx------ 1 root root 64 Jan 1 08:31 2 -> /dev/console ls: /proc/self/fd/3: cannot read link: No such file or directory lr-x------ 1 root root 64 Jan 1 08:31 3 ls -l /dev/console crw------- 1 root root 5, 1 Jan 1 08:32 /dev/console


В чём прблема?
Спасибо.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: CGI: обработка POST bash-ем

Сообщение eddy »

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

#!/bin/sh
#Converts Data sent by method Post or Get
# into stdout like param1 name1 param2 name2 etc.

if [ "$REQUEST_METHOD" = "POST" ]; then
    QUERY_STRING=`cat -`
fi

line=`echo $QUERY_STRING|sed 's/&/ /g'`

for pair in $line
do
    name=`echo $pair|sed 's/=/ /g'|awk '{print $1}'`
    type=`echo $pair|sed 's/=/ /g'|awk '{print $2}'|sed -e 's/%\(\)/\\\x/g'|sed 's/+/ /g'`
    printf "${name}=\"${type}\"\n"
done
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: CGI: обработка POST bash-ем

Сообщение IMB »

Ну что тут можно сказать кроме Спасибо?
Теперь буду разбираться как связать его с AJAX. Правильнее сказать- связь уже есть, в Firebug я вижу ответ 200 на команду.
Осталось только приделать ответ серверу - удачно выполнена команда или ошибка.
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: CGI: обработка POST bash-ем

Сообщение eddy »

IMB писал(а):
03.08.2010 17:58
Ну что тут можно сказать кроме Спасибо?
Теперь буду разбираться как связать его с AJAX.

Пожалуйста. Только вы с башем поосторожнее: если сервер публичный, таким скриптом лучше не пользоваться: никаких проверок на безопасность входящих данных нет.
Я CGI на баше использую только дома, а для внешних сервисов использую функции:

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

#include <string.h>
// сначала вызывается эта функция, буфер buf длины l+1 выделяется заранее, например, malloc'ом
char* get_qs(char* buf, int l){
    char *m, *qs = NULL;
    if((m = getenv("REQUEST_METHOD")) && strcasecmp(m, "POST") == 0)
        qs = fgets(buf, l, stdin);
    else if( (qs = getenv("QUERY_STRING")) )
        strncpy(buf, qs, l);
    if(qs && strlen(qs) < 1) qs = NULL;
    return qs;
}
// если строка запроса есть, вызываем эту функцию
// qs - полученная предыдущей ф-й строка запроса
// param - переменная, значение которой надо узнать
// meaning - буфер длины l + 1 для значения этой переменной (если она есть)
// если переменной param нет или не указано ее значение, возвращается 0
int get_qs_param(char *qs, char *param, char *meaning, int l){
    char *tok, *val, *par, str[l+1];
    int stat = 0;
    strncpy(str, qs, l);
    tok = strtok(str, "&,;| \n");
    do{
        if((val = strchr(tok, '=')) == NULL) continue;
        *val++ = '\0';
        par = tok;
        if(strcasecmp(par, param)==0){
            stat = 1;
            strncpy(meaning, val, l); // если здесь сделать strdup, l и предварительное выделение буфера будут не нужны
            break;
        }
    }while((tok = strtok(NULL, "&,;| \n"))!=NULL);
    return stat;
}
// эта функция используется для получения списка параметров запроса
// qs - запрос
// params - массив из n строк длиной l каждая
// возвращает количество обнаруженных параметров запроса
// можно переписать и динамически: получить кол-во параметров,
// затем alloc массива указателей нужного размера и strdup каждый параметр
int list_qs_params(char *qs, char **params, int l, int n){
    char *tok, *val, *par, *str;
    int num = 0, i = 0;
    str = strdup(str, qs);
    tok = strtok(str, "&,; | \n");
    do{
        if((val = strchr(tok, '=')) == NULL) continue;
        *val++ = '\0';
        num++;
        par = tok;
        if(i++ < n)
            strncpy(params[i], val, l);
        else break;
    }while((tok = strtok(NULL, "&,; | \n"))!=NULL);
        free(str);
    return num;
}
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: CGI: обработка POST bash-ем

Сообщение IMB »

Да, можно сказать публичный, только не сервер, а готовое изделие. Ну а проверки, думаю в скрипте их тоже можно организовать, ну а "первой линие" будет проверка в JavaScript, знаю что легко обходится.
Спасибо сказали: