Par*_*ris 19 perl post command-line cgi get
我试图通过命令行参数发送get或post.那是在我通过浏览器测试之前在命令行中测试脚本(服务器有问题).我尝试在线搜索,我想我可能使用了不正确的术语,因为我什么也没得到.我知道这是可能的,因为我看到有人这样做.我只是不记得它是如何完成的.
谢谢!:)
Gre*_*con 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;
Run Code Online (Sandbox Code Playgroud)
您在命令行上提供参数:
$ ./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
bri*_*foy 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
Run Code Online (Sandbox Code Playgroud)
如果您正在为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
Run Code Online (Sandbox Code Playgroud)
您可以根据需要使用它,并且每次要测试程序时,都会更改query_string或post_data文件中的数据.如果您不想在shell脚本中执行此操作,则创建包装器Perl脚本同样容易.
小智 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.
Run Code Online (Sandbox Code Playgroud)