如何通过命令行将POST和GET数据发送到Perl CGI脚本?

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)