代码之家  ›  专栏  ›  技术社区  ›  Parris

如何通过命令行向PerlCGI脚本发送post和获取数据?

  •  19
  • Parris  · 技术社区  · 16 年前

    我试图通过命令行参数发送get或post。这就是在我通过浏览器进行测试之前在命令行中测试脚本(服务器有问题)。我试着在网上搜索,我想我可能是用了不正确的术语,因为我什么都没有。我知道这是可能的,因为我看到有人这样做。我只是不记得是怎么做到的。

    谢谢!:)

    8 回复  |  直到 9 年前
        1
  •  21
  •   Greg Bacon    16 年前

    您使用的是标准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;
    

    在命令行中输入IT参数:

    $ ./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
  •  19
  •   brian d foy    16 年前

    要从命令行测试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
    

    您可以根据需要进行修改,每次您想要测试程序时,都要更改查询字符串或post数据文件中的数据。如果您不想在shell脚本中这样做,那么创建一个包装Perl脚本也很容易。

        3
  •  5
  •   FredW    15 年前

    旧的讨论,但我在寻找同样的答案-所以对于那些跟随者-这就是我发现的

    无线电调频!从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.
    
        4
  •  3
  •   Strawberry    13 年前

    如果您不想更改Perl脚本,您可以使用至少设置了两个环境变量来调用它,正如前面提到的那样。要模拟GET请求,请执行以下操作:

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

    这是www.myserver.org/events_html.pl的控制台快捷方式?极限=20

        5
  •  1
  •   amarillion    16 年前

    是的,可以从命令行绕过服务器来执行此操作。本页解释了所有: Perl CGI debugging (sitewizard.com)

    要脱机测试脚本,请使用 get方法,只需设置 查询字符串环境变量 因此。如果您使用的是Windows, 您可以使用以下命令 运行前在DOS窗口中行 同一窗口中的脚本:

    设置query_string=recipient=john@doe.com&fullname=m+name

    要脱机测试脚本,请使用 post方法,将下面的行放入 名为testinput.txt的文本文件。

    收件人=john@doe.com&fullname=m+name

    然后将该文件作为输入重定向到 剧本。在Unix系统以及 在Windows的msdos提示下,您可以 这样做:

    perl-w scriptname.pl<testinput.txt

    然后您的脚本将收到 输入,就好像它是由 网站上的表单。检查错误 Perl发出的消息(如果有的话)将 帮助您跟踪 脚本。

        6
  •  0
  •   Jake    15 年前

    要提供CGI脚本发布数据,请执行以下操作:

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

    要给CGI脚本获取数据,请执行以下操作:

    $ perl index.cgi 'a=b;c=d'
    
        7
  •  -1
  •   Alan Haggai Alavi    16 年前

    LWP 附带可以从命令行使用的现成脚本。检查 GET POST 系统中的脚本。

        8
  •  -1
  •   Luke Puplett    13 年前

    在Windows中,可以使用vbscript编写命令行util,该命令行util调用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
    

    编辑:这个脚本发送HTTP请求,可以从命令行使用。我被“如何通过命令行向PerlCGI脚本发送post和获取数据”这个问题弄糊涂了,我认为这是关于通过命令行从未指定的客户机操作系统向PerlCGI脚本发送post和获取数据。

    推荐文章