Вертикальные кавычки Perl CGI Script с корнем

Я хотел запустить скрипт 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 мне нужны повышенные привилегии, потому что, когда я просто запускаю скрипт из bash как root работает нормально.

Вопрос:
Есть ли способ запустить такой скрипт с обратными кавычками через 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 просто не хочет :/


person Jan Kubik    schedule 30.08.2017    source источник
comment
Ваш тип контента неверен. Это должно быть text/plain (это не является причиной вашей проблемы, я просто подумал, что вы должны знать).   -  person Dave Cross    schedule 30.08.2017
comment
возвращает пустую строку не означает без проблем. Некоторые другие вещи, которые можно попробовать, - это захватить stderr команды ($result = qx(lpc status all 2>&1)) и вывести статус выхода ($?).   -  person mob    schedule 30.08.2017
comment
ах блин .. в моем оригинале это правильно .. последний - мой тестовый пример с модулем IPC:: System:: Simple, и я написал этот фрагмент по памяти и перевернул его :) --------- -- предложение с STDERR на STDOUT по-прежнему возвращает пустую строку и $? возвращает 0   -  person Jan Kubik    schedule 30.08.2017
comment
Скрипт оболочки работает без sudo? Если нет, то почему вы ожидаете, что Perl-скрипт, выполняющий команду, будет работать без него? Если это так, почему вы используете sudo? Это кажется мне проблемой разрешения.   -  person bytepusher    schedule 30.08.2017
comment
да работает без sudo   -  person Jan Kubik    schedule 31.08.2017


Ответы (1)


Главное помнить, что веб-сервер запускает вашу программу, а не вы. Когда вы запускаете ls или lpc, это работает, потому что у вас есть /bin и /usr/sbin в вашем PATH. Run: which lpc ... когда я это делаю, я получаю /usr/sbin/lpc, что означает, что мне нужно /usr/sbin в моем PATH, чтобы запустить lpc без указания полного пути. Попробуйте добавить строку:

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

до конца вашей программы. Если требуемый каталог отсутствует, вы можете добавить:

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

или что-то подобное в вашей программе перед любыми системными или обратными вызовами

person Ken Schumack    schedule 07.09.2017
comment
на самом деле вы совершенно правы. запущен небольшой Perl-демон, ожидающий сокета - person Jan Kubik; 20.09.2017