我想用反引号运行Perl CGI脚本。
示例:
#!/usr/bin/perl -w
use warnings;
use strict;
use JSON;
use CGI;
use CGI::Carp 'fatalsToBrowser';
my $cgi = CGI->new;
my $result = `lpc status all`;
print $cgi->header(-type => "plain/text", -charset => "utf-8");
print $result;
脚本运行没有问题,但返回一个空字符串
当我使用像ls
这样的命令时,它可以很好地工作
我的猜测是,在这种情况下,lpc命令我需要提升权限,因为当我只是以root身份从bash运行脚本时它工作正常。
问题:
有没有办法在Apache上使用反引号运行这样的脚本?是否有可以帮助我实现它的Perl模块?
我想到的唯一解决方案就是编写一个服务程序来监听TCP端口本身,但我不想沿着那条路走下去。
新尝试:
我也尝试使用以下内容制作一个bash脚本
#!/bin/bash
sudo lpc status all
我编辑了/ etc / sudoers到这个
apache ALL=(ALL) NOPASSWD:/path/to/script/lpcsa.sh
并更改了perl脚本,如下所示
my $result = qx(bash lpcsa.sh);
现在它在命令行之外工作,但是通过HTTP它不想:/
答案 0 :(得分:0)
关键是要记住Web服务器正在运行您的程序而不是您。当你运行ls或lpc时它会起作用,因为你的PATH中有/ bin和/ usr / sbin。运行:哪个lpc ...当我这样做时我得到/ usr / sbin / lpc这意味着我需要在我的PATH中使用/ usr / sbin才能运行lpc而不提供完整路径。尝试添加以下行:
print "\nPATH=" . $ENV{'PATH'};
到你的程序结束。如果不存在所需的目录,您可以做的一件事就是添加:
$ENV{'PATH'} .= ":/usr/sbin";
在任何系统或反拨电话之前,或某些此类程序