LINUX.ORG.RU

CGI и #!/bin/sh


1

1

При передачи методом POST через форму какой-либо переменной скрипту на сервер как извлечь в скрипте эту переменную?

Перемещено beastie из general

Ответ на: комментарий от joy4eg

Вот такая форма, например:

<form name="main" action="/cgi-bin/script.sh" method="POST">
	<b>Параметр_1</b>
	<input name="param1" size="50">
	<b>Параметр_2</b>
	<input name="param2" size="50">
	<input type=submit size="2" value="Отправить">
</form>
как видно, она запускает скрипт на сервере script.sh. Что надо в этом скрипте написать, чтобы переменные вызвать param1, param2 и т.д.

podovalov5 ()
Ответ на: комментарий от podovalov5

Напиши в своем скрипте:

#!/bin/sh

set > /tmp/my_super_script_env.log

И потом посмотри содержание файла ...

joy4eg ★★★★★ ()
Ответ на: комментарий от podovalov5

надо парсить stdin. но в случае с башем есть убер-фича:

POST_DATA=$(</dev/stdin)
все переменные CGI становятся переменными окружения.

Lincor ()
Ответ на: комментарий от joy4eg

В файле переменные окружения. Но мне-то нужны те переменные, которые форма мне прислала.

podovalov5 ()
Ответ на: комментарий от Lincor

т.е. в случае с твоей формой ты сможешь обратиться к ним как $param1/$param2.

Lincor ()
Ответ на: комментарий от Lincor

я так и думал, но мне сервер возвращает

500 Internal Error
There was an unusual problem serving the requested URL '/cgi-bin/script.sh'

А при запуске на сервере вручную скрипта /cgi-bin/script.sh

./script.sh: line 1: #!/bin/sh: not found

Что бы это могло означать?

podovalov5 ()
Ответ на: комментарий от podovalov5

Что у тебя нет исполняемого файла /bin/sh либо прав на его запуск

trofk ★★★ ()
Ответ на: комментарий от trofk

кстати, да, скорее всего, прав нет. тогда ТС-у остается только пинать админа, либо искать другой сервер.

Lincor ()
Ответ на: комментарий от trofk

а еще запускается правильно так

sh myscript.sh
anonymous ()

GET передаётся через переменные (и частично через argv), POST через stdin.

На затравку (stdin добавь сам):

#!/bin/sh

# disable filename globbing
set -f

echo Content-type: text/plain
echo

echo CGI/1.0 test script report:
echo

echo argc is $#. argv is "$*".
echo

echo SERVER_SOFTWARE = $SERVER_SOFTWARE
echo SERVER_NAME = $SERVER_NAME
echo GATEWAY_INTERFACE = $GATEWAY_INTERFACE
echo SERVER_PROTOCOL = $SERVER_PROTOCOL
echo SERVER_PORT = $SERVER_PORT
echo REQUEST_METHOD = $REQUEST_METHOD
echo HTTP_ACCEPT = "$HTTP_ACCEPT"
echo PATH_INFO = "$PATH_INFO"
echo PATH_TRANSLATED = "$PATH_TRANSLATED"
echo SCRIPT_NAME = "$SCRIPT_NAME"
echo QUERY_STRING = "$QUERY_STRING"
echo REMOTE_HOST = $REMOTE_HOST
echo REMOTE_ADDR = $REMOTE_ADDR
echo REMOTE_USER = $REMOTE_USER
echo AUTH_TYPE = $AUTH_TYPE
echo CONTENT_TYPE = $CONTENT_TYPE
echo CONTENT_LENGTH = $CONTENT_LENGTH
beastie ★★★★★ ()
Ответ на: комментарий от beastie

На затравку (stdin добавь сам):

Подскажи, а что я должен с stdin сделать в твоем примере?

podovalov5 ()
Ответ на: комментарий от podovalov5

Добавить что-то вроде:

#!/bin/sh

while read line; do
        echo Got line: $line
done
beastie ★★★★★ ()
Ответ на: комментарий от beastie

while read line

Если даннаые переданые через пост бинарные, то это даст странный результат

antares0 ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.