带有 root 的 Perl CGI 脚本反引号

Perl CGI Script backticks with root

我想 运行 一个带反引号的 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;  

脚本 运行 没有问题,但 returns 是一个空字符串。
当我使用像 ls 这样的命令时,它工作得很好。
我的猜测是,在这种情况下,我需要提升权限的 lpc 命令,因为当我只是 运行 来自 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 上它只是不想:/

关键是要记住网络服务器 运行正在运行您的程序而不是您。当您使用 运行 ls 或 lpc 时,它会起作用,因为您的 PATH 中有 /bin 和 /usr/sbin。 运行: which lpc ... 当我这样做时我得到 /usr/sbin/lpc 这意味着我需要 /usr/sbin 在我的 PATH 中以便 运行 lpc 没有给出完整路径。尝试添加行:

print "\nPATH=" . $ENV{'PATH'};

到程序结束。如果所需的目录不存在,您可以做的一件事是添加:

$ENV{'PATH'} .= ":/usr/sbin";

或在任何系统或反引号调用之前对您的程序进行一些此类调用