如何将信息从 web 传递到 perl 脚本?

Posted

技术标签:

【中文标题】如何将信息从 web 传递到 perl 脚本?【英文标题】:How can I pass information into perl script from web? 【发布时间】:2015-10-03 00:03:13 【问题描述】:

我想使用 java 脚本调用 perl script,并传递一个 java 脚本变量?此脚本已由其他人编写。我只希望他们的脚本在一些文本上,然后在我的网站上输出结果。问题是脚本需要一个文件作为输入。

perl脚本有如下用法

latexindent.pl [options] [file][.tex]

我想在调用此脚本时传入一个文本框,并将打印到控制台的命令返回给我的 javascript 函数。

function ajax_info() 
    $.ajax(
        url:       "latexindent.pl",
        cache:     false,
        dataType:  "text",
        data:       mode: 'This is Some text!' ,
        success:   function(result)  ajax_info_result(result); 
    );



function ajax_info_result(result) 
    var text   = "The server says: <b>" + result + "</b>";
    $('#info').html(text);

【问题讨论】:

为什么投反对票?无论如何我可以改进这个问题吗? 让我先澄清一下我的理解:在服务器中有一个名为“latexindent.pl”的文件,它以文本文件作为输入。对??由于这个 perl 脚本需要一个文件作为输入,所以你不能直接将 ajax 请求传递给它。现在你有两个选项,简单,要么编辑“latexindent.pl”以接受发布请求,要么制作另一个脚本,将 ajax 请求内容存储在文本文件中,然后可以通过传递文本文件执行“latexindent.pl” . @DineshPatra 你是对的,我在服务器上有那个文件。我只是不知道如何制作一个文本文件然后执行它。那也安全吗? 【参考方案1】:

你提到 CGI 作为一个标签,所以我假设你没有使用 node.js,在这种情况下你会按照

var exec = require('child_process').exec;
var cmd = 'prince -v builds/pdf/book.html -o builds/pdf/book.pdf';

exec(cmd, function(error, stdout, stderr) 
// command output is in stdout
);

因此,假设您希望将 perl 作为由 Web 服务器执行的 CGI 在服务器上运行,那么正如 Dinesh 指出的那样,您有 2 个选项。

选项 1:

编辑文件以充当 CGI 并通过配置 CGI 处理程序等使其通过 Web 服务器访问。

基本上你需要: 包括 CGI.pm,提取发布的参数并使用这些参数代替文件内容。这些方面的内容应该可以帮助您入门。

#!/usr/bin/perl

use strict;
use warnings;
use CGI::Carp qw(fatalsToBrowser);
use JSON;

my $cgi = CGI::Carp->new();
my $data = from_json( $cgi->param('mode') ); ## prob need to tweak 

## now continue with your processing using $data instead of the file content.

打开 2: 创建一个 perl CGI 或配置您的 Web 服务器以处理请求和执行您现有的脚本。

使用类似的代码,但使用 system()、exec 或 `` 方法执行。请务必阅读安全问题以及这些调用在捕获输出和注入安全问题可能性方面的方法之间的差异。

【讨论】:

【参考方案2】:

Dinesh Patra 的评论帮助我得出了答案: 制作一个包装方法来创建一个文件,他们使用创建的文件执行脚本。无需对 perl 脚本进行任何更改。 这是我以最通用的方式所做的。解释如下。

Javascript:

    function sendValueOne(textToSend) 
        $.post("path/to/php/Wraper.php", text: textToSend,
        function (data) 
            $('#id').html(data.result);
        , "json");
    

PHP:

$value = $_POST['text'];       //Get text from post
$uniqueid  = getGUID();      //Create Guid (unique identifier)
//Write file to server.
$file = fopen("$uniqueid.tex", "w") or die("Unable to open file!");
fwrite($file, $value);
fclose($file);

//Execute the script passing the file
$result = shell_exec("perl perl path/to/perl/script.pl $uniqueid.tex");

//Delete the file
unlink("$uniqueid.tex");

//Return result
$response = new STDclass();
$response->result = "$result";
echo json_encode($response);

//Function found online to create guid
function getGUID()
    if (function_exists('com_create_guid') === true)
        return trim(com_create_guid(), '');
    
return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));

    您希望使用 javascript 将要输入脚本的文本发送到 php。
 $.post("path/to/php/Wraper.php", text: textToSend,
        function (data) 
            $('#id').html(data.result);
        , "json");
    创建一个 GUID,一个文件的唯一标识符,以便我们之后可以删除该文件。我使用了我找到的函数online.
$uniqueid  = getGUID(); 
    使用 guid 创建文件。
$file = fopen("$uniqueid.tex", "w") or die("Unable to open file!");
fwrite($file, $value);
fclose($file);
    执行 perl 脚本并将输出保存到变量中
$result = shell_exec("perl perl path/to/perl/script.pl $uniqueid.tex");
    现在删除文件并对输出进行 json 编码并将其返回给 java 脚本。
//Delete the file
unlink("$uniqueid.tex");

//Return result
$response = new STDclass();
$response->result = "$result";
echo json_encode($response);
    最后,我们将结果返回到我们的网站,并且可以用它做任何我们想做的事情。
  $.post("path/to/php/Wraper.php", text: textToSend,
      function (data) 
          $('#id').html(data.result); //Do something with result.
      , "json");

【讨论】:

以上是关于如何将信息从 web 传递到 perl 脚本?的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从 Perl 传递到 Java?

在 Perl 中将包含空格的参数从一个脚本传递到另一个脚本

Perl - 我如何将完整的目录路径名传递给 perl 脚本

从cron运行时,Perl脚本不会将STDOUT输出到文件

从 Web UI 与本地 Perl 脚本交互

Perl:将当前目录包含到@INC吗?