我正在尝试通过命令行参数发送get或post。那是在我通过浏览器测试之前在命令行中测试脚本(服务器有问题)。我尝试在线搜索,我想我可能使用了不正确的术语,因为我什么也没得到。我知道这是可能的,因为我看到有人这样做。我只是不记得它是如何完成的。
谢谢! :)
答案 0 :(得分:21)
您使用的是标准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
答案 1 :(得分:19)
要从命令行测试CGI程序,您可以伪造服务器为程序创建的环境。 CGI.pm有一个特殊的离线模式,但我经常发现它更容易不使用,因为我需要为我的程序通常期望的其他一切做额外的设置。
根据脚本的实现,这涉及设置许多环境变量,您可以从假装成服务器的包装脚本中执行此操作:
#!/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文件中的数据。如果您不想在shell脚本中执行此操作,那么创建包装器Perl脚本也同样容易。
答案 2 :(得分:5)
旧讨论,但我一直在寻找相同的答案 - 所以对于那些关注的人 - 这就是我发现的
RTFM!来自CGI手册页(还有更多) 调试 如果从命令行或perl运行脚本 调试器,您可以向脚本传递关键字列表或参数=值 在命令行或标准输入上对(你不必 担心欺骗你的脚本从环境中读取 变量)。您可以传递以下关键字:
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.
答案 3 :(得分:3)
如果您不想更改perl脚本,可以使用至少两个环境变量集来调用它,正如其他人已经提到的那样。要模拟GET请求:
shell$ QUERY_STRING=limit=20 REQUEST_METHOD=GET ./events_html.pl
这是www.myserver.org/events_html.pl?limit=20
的控制台快捷方式答案 4 :(得分:1)
是的,可以从命令行执行此操作,绕过您的服务器。此页面解释了所有:Perl CGI debugging (sitewizard.com)(特别是该页面上的第6项)。在这里,我引用最重要的部分:
使用。离线测试脚本 GET方法,只需设置 QUERY_STRING环境变量 因此。如果您使用的是Windows, 您可以使用以下命令 在运行之前在DOS窗口中排队 同一个窗口中的脚本:
设置QUERY_STRING=recipient=John@Doe.com& Fullname = M + Name
使用。离线测试脚本 POST方法,把下面的行放到一个 名为testinput.txt的文本文件。
recipient=John@Doe.com&全名= M +名称
然后将该文件重定向为输入 剧本。在Unix系统上以及 在Windows的MSDOS提示下,你可以 这样做:
perl -w scriptname.pl&lt; testinput.txt
然后您的脚本将收到该脚本 输入好像是由a发送的 网站上的表格。检查错误 perl spouts的消息,如果有的话 帮助您跟踪问题 脚本。
答案 5 :(得分:0)
给cgi脚本发布数据:
$ echo -n 'a=b;c=d' | REQUEST_METHOD=POST CONTENT_LENGTH=999 perl index.cgi
给cgi脚本获取数据:
$ perl index.cgi 'a=b;c=d'
答案 6 :(得分:-1)
LWP附带现成的脚本,可以从命令行使用。检查系统中的GET
和POST
脚本。
答案 7 :(得分:-1)
在Windows中,您可以使用VBScript编写调用MS XML库的命令行util:
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
编辑:此脚本发送HTTP请求,可以从命令行使用。我对如何通过命令行发送POST和GET数据到Perl CGI脚本的问题感到困惑,并认为这是关于通过命令行从未指定的客户端操作系统发送POST和GET数据到Perl CGI脚本。