Подтвердить что ты не робот

Как я могу отправить данные POST и GET в CGI Perl script через командную строку?

Я пытаюсь отправить сообщение get или post через аргумент командной строки. Это тест script в командной строке, прежде чем я проведу проверку через браузер (у сервера есть проблемы). Я пробовал искать в Интернете, и я полагаю, что я, вероятно, использовал неправильную терминологию, потому что ничего не получил. Я знаю, что это возможно, потому что я видел, как кто-то это делает. Я просто не помню, как это было сделано.

Спасибо!:)

4b9b3361

Ответ 1

Используете ли вы стандартный модуль CGI?

Например, со следующей программой (уведомление -debug в аргументах use CGI)

#! /usr/bin/perl

use warnings;
use strict;

use CGI qw/ :standard -debug /;

print "Content-type: text/plain\n\n",
      map { $_ . " => " . param($_) . "\n" }
      param;

вы передаете параметры в командной строке:

$ ./prog.cgi foo=bar baz=quux
Content-type: text/plain

foo => bar
baz => quux

Вы также можете сделать это через стандартный ввод:

$ ./prog.cgi
(offline mode: enter name=value pairs on standard input; press ^D or ^Z when done)
foo=bar
baz=quux
^D
Content-type: text/plain

foo => bar
baz => quux

Ответ 2

Чтобы проверить программу CGI из командной строки, вы подделываете среду, которую создает сервер для программы. CGI.pm имеет специальный автономный режим, но часто мне легче его не использовать из-за дополнительной настройки, которую мне нужно сделать для всего, что обычно ожидают мои программы.

В зависимости от реализации вашего script, это включает в себя установку множества переменных среды, которые вы можете сделать из оболочки script, которая претендует на роль сервера:

 #!/bin/bash

 export HTTP_COOKIE=...
 export HTTP_HOST=test.example.com
 export HTTP_REFERER=...
 export HTTP_USER_AGENT=...
 export PATH_INFO=
 export QUERY_STRING=$(cat query_string);
 export REQUEST_METHOD=GET

 perl program.cgi

Если вы делаете это для запроса POST, среда немного отличается, и вам необходимо предоставить данные POST на стандартный ввод:

 #!/bin/bash

 export CONTENT_LENGTH=$(perl -e "print -s q/post_data/");
 export HTTP_COOKIE=...
 export HTTP_HOST=test.example.com
 export HTTP_REFERER=...
 export HTTP_USER_AGENT=...
 export PATH_INFO=...
 export QUERY_STRING=$(cat query_string);
 export REQUEST_METHOD=POST

 perl program.cgi < post_data

Вы можете сделать это столь же причудливым, насколько вам нужно, и каждый раз, когда вы хотите протестировать программу, вы изменяете данные в файлах query_string или post_data. Если вы не хотите делать это в оболочке script, так же легко сделать оболочку Perl script.

Ответ 3

Старая дискуссия, но я искал те же ответы - так для тех, кто следует - вот что я узнал

RTFM! с страницы руководства CGI (и есть больше) DEBUGGING   Если вы запускаете script из командной строки или в perl   отладчик, вы можете передать script список ключевых слов или параметр = значение   пар в командной строке или со стандартного ввода (вам не нужно   беспокоиться о том, чтобы обмануть ваш script в чтение из среды   переменные). Вы можете передавать такие ключевые слова:

    your_script.pl keyword1 keyword2 keyword3

or this:

   your_script.pl keyword1+keyword2+keyword3

or this:

    your_script.pl name1=value1 name2=value2

or this:

    your_script.pl name1=value1&name2=value2

To turn off this feature, use the -no_debug pragma.

Ответ 4

Если вы не хотите изменять perl script, вы можете вызвать его, по крайней мере, с двумя переменными окружения, как уже упоминалось ранее. Чтобы имитировать запрос GET:

shell$ QUERY_STRING=limit=20 REQUEST_METHOD=GET ./events_html.pl

Что консольный ярлык для www.myserver.org/events_html.pl?limit=20

Ответ 5

Да, это возможно сделать из командной строки, минуя ваш сервер. На этой странице объясняются все: Отладка Perl CGI (sitewizard.com) (особенно пункт 6 на этой странице). Здесь я цитирую наиболее важную часть:

Чтобы протестировать script в автономном режиме, используя GET, просто установите Переменная окружения QUERY_STRING соответственно. Если вы используете Windows, вы можете использовать следующую команду в окне DOS перед запуском script в том же окне:

установить [email protected]& Полное имя = M + Название

Чтобы протестировать script в автономном режиме, используя POST, введите строку ниже в текстовый файл с именем, скажем, testinput.txt.

[email protected]& = Полное имя М + Имя

Затем перенаправить этот файл в качестве входного script. В системах Unix, а также в командной строке Windows "MSDOS" вы можете сделайте это так:

perl -w scriptname.pl < testinput.txt

Затем ваш script получит как будто он был отправлен форме на веб-сайте. Проверьте ошибку сообщения о том, что перлы, если они есть, поможет вам отслеживать проблему в script.

Ответ 6

Чтобы предоставить данные cgi script:

$ echo -n 'a=b;c=d' | REQUEST_METHOD=POST CONTENT_LENGTH=999 perl index.cgi

Чтобы предоставить cgi script получить данные:

$ perl index.cgi 'a=b;c=d'

Ответ 7

LWP поставляется с готовыми скриптами, которые могут использоваться из командной строки. Проверьте сценарии GET и POST в вашей системе.

Ответ 8

В Windows вы можете использовать VBScript для записи командной строки, которая вызывает вызовы в библиотеку MS XML:

Dim XMLHttp : Set XMLHttp = CreateObject("Microsoft.XMLHTTP")
On Error Resume Next

strIPAddress = WScript.Arguments(0)
strMACAddress = WScript.Arguments(1)
strSubnetMask = WScript.Arguments(2)

On Error Goto 0

WScript.Echo "Attempting to wake host " & strIPAddress & " on NIC " & strMACAddress &
"using netmask " & strSubnetMask

strGetUrl = http://wolService/WolService/WolService.asmx/WakeBroadcast?hostIP=" &
strIPAddress & "&macAddress=" & strMACAddress & "&subnetMask=" & strSubnetMask

XMLHttp.Open "GET", strGetUrl, False
XMLHttp.Send ""

WScript.Echo XMLHttp.ResponseText

Изменить: этот script отправляет HTTP-запросы и может использоваться из командной строки. Я запутался в вопросе "Как я могу отправить данные POST и GET в CGI Perl script через командную строку" и думал, что это связано с отправкой данных POST и GET в Perl CGI script через командную строку из неопределенной клиентской ОС.