2010-02-08 8 views
19

J'essaie d'envoyer un get ou un post via un argument de ligne de commande. C'est tester le script dans la ligne de commande avant de tester via un navigateur (le serveur a des problèmes). J'ai essayé de faire des recherches en ligne, et je suppose que j'utilisais probablement une terminologie incorrecte parce que je n'avais rien. Je sais que c'est possible parce que j'ai vu quelqu'un le faire. Je ne me souviens pas comment ça a été fait.Comment envoyer des données POST et GET à un script Perl CGI via la ligne de commande?

Merci! :)

Répondre

21

Utilisez-vous le module CGI standard?

Par exemple, avec le programme suivant (avis -debug dans les arguments à 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; 

vous alimentez des paramètres sur la ligne de commande:

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

foo => bar 
baz => quux

Vous pouvez également le faire via entrée standard:

$ ./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

Oui, il est possible de le faire depuis la ligne de commande, en contournant votre serveur. Cette page explique tout: Perl CGI debugging (sitewizard.com) (Surtout le point 6 sur cette page). Ici, je cite la partie la plus importante:

Pour tester le mode hors connexion de script en utilisant la méthode GET , il suffit de définir la variable d'environnement QUERY_STRING en conséquence. Si vous utilisez Windows, vous pouvez utiliser la ligne de commande suivante dans une fenêtre DOS avant d'exécuter le script dans la même fenêtre:

set [email protected] & = M + Nom complet Nom

Pour tester le script hors ligne à l'aide de la méthode POST , placez la ligne ci-dessous dans un fichier texte nommé, par exemple, testinput.txt.

[email protected] & = M + Nom complet Nom

redirigent ensuite ce fichier comme entrée pour le script. Sur les systèmes Unix, ainsi que sous l'invite MSDOS de Windows, vous pouvez le faire cette façon:

perl -w scriptname.pl < testinput.txt

Votre script recevra alors cette entrée comme si elle a été envoyé par un formulaire sur le site Web. Vérifiez les messages d'erreur que les becs perl, le cas échéant, à vous aider à suivre le problème dans le script .

+0

Pour référence, l'approche de l'environnement variable/entrée standard fonctionne avec toute application CGI , Perl ou autre. – fennec

+0

Ce conseil est manquant un peu, pour ne pas mentionner que l'exemple de ligne de commande n'a aucun espoir de travailler. –

-1

LWP est livré avec des scripts prêts à l'emploi qui peuvent être utilisés à partir de la ligne de commande. Vérifiez les scripts GET et POST dans votre système.

+0

Ceci est une chose différente. Il veut exécuter un script CGI à partir de la ligne de commande (pas de serveur) pour le tester. –

17

Pour tester un programme CGI à partir de la ligne de commande, vous simulez l'environnement créé par le serveur pour le programme. CGI.pm a un mode hors ligne spécial, mais souvent je trouve qu'il est plus facile de ne pas l'utiliser en raison de la configuration supplémentaire que j'ai besoin de faire pour tout ce que mes programmes attendent généralement.

En fonction de la mise en œuvre de votre script, cela implique la définition de variables d'environnement, que vous pouvez faire à partir d'un script d'emballage qui prétend être le serveur:

#!/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 

Si vous faites cela pour un POST demande, l'environnement est légèrement différent et vous devez fournir les données POST sur l'entrée standard:

#!/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 

vous pouvez en faire autant de fantaisie que vous avez besoin et à chaque fois que vous voulez tester le programme, vous modifiez des données dans les fichiers query_string ou post_data . Si vous ne voulez pas faire cela dans un script shell, il est tout aussi facile de créer un script Perl wrapper.

-1

Dans Windows, vous pouvez utiliser VBScript pour écrire une ligne de commande util qui appelle dans la bibliothèque XML MS:

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 

Edit: Ce script envoie des requêtes HTTP et peut être utilisé à partir de la ligne de commande. La question «Comment envoyer des données POST et GET à un script Perl CGI via la ligne de commande» m'a-t-elle perturbé et j'ai pensé qu'il s'agissait d'envoyer des données POST et GET à un script Perl CGI via la ligne de commande d'un système d'exploitation client non spécifié.

+0

Il veut exécuter un script sur la ligne de commande pour le tester. Il n'y a pas de serveur. –

5

discussion Vieux, mais je cherchais les mêmes réponses - donc pour ceux qui suivent - ce que j'ai découvert

RTFM! DEBUGGING Si vous exécutez le script depuis la ligne de commande ou dans le débogueur perl , vous pouvez passer au script une liste de mots-clés ou de paramètres = valeur paires sur la ligne de commande ou à partir de l'entrée standard (vous n'avez pas à s'inquiéter de tromper votre script dans la lecture de l'environnement variables). Vous pouvez passer des mots-clés comme ceci:

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. 
0

Pour donner un données post script cgi:

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

Pour donner un script cgi obtenir des données:

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

Si vous ne voulez pas Pour modifier le script Perl, vous pouvez l'appeler avec au moins deux variables d'environnement définies, comme d'autres l'ont déjà mentionné. Pour simuler une requête GET:

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

C'est le raccourci de la console pour www.myserver.org/events_html.pl?limit=20