Perl CGI Script使用root进行反复操作

时间:2017-08-30 12:45:29

标签: perl cgi backticks

我想用反引号运行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它不想:/

1 个答案:

答案 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";
在任何系统或反拨电话

之前,

或某些此类程序