2017-08-30 6 views
0

Je voulais lancer un script CGI Perl avec des backticks.Perl CGI Script backticks avec la racine

Exemple:

#!/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; 

Le script est exécuté sans problème, mais retourne une chaîne vide.
Lorsque j'utilise une commande comme ls cela fonctionne parfaitement.
Ma conjecture est que dans ce cas la commande lpc j'ai besoin de privilèges élevés parce que quand je lance le script depuis le bash en tant que root cela fonctionne très bien.

La question:
Y at-il un moyen d'exécuter un script avec Apache sur les apostrophes inverses? Y at-il un module Perl qui peut m'aider à le faire autrement? La seule solution qui m'est venue à l'esprit serait d'écrire un programme de service qui écoute les ports TCP eux-mêmes, mais je ne voulais pas suivre cette voie.

NOUVEAU TRY:
J'ai aussi essayé de faire un script bash avec le contenu suivant

#!/bin/bash 
sudo lpc status all 

J'édité/etc/sudoers à ce

apache ALL=(ALL) NOPASSWD:/path/to/script/lpcsa.sh 

et a changé le script perl suivi

my $result = qx(bash lpcsa.sh); 

hors de la ligne de commande cela fonctionne maintenant mais sur HTTP il ne veut tout simplement pas:/

+0

Votre type de contenu est erroné. Il devrait être «texte/plaine» (cela ne cause pas votre problème, je pensais juste que vous devriez savoir). –

+0

"renvoie une chaîne vide" ne signifie pas "sans problème". D'autres choses à essayer sont de capturer le stderr de la commande ('$ result = qx (lpc status all 2> & 1)') et de sortir le statut de sortie ('$?'). – mob

+0

ah damn .. dans mon original c'est correct .. le dernier est mon cas de test avec IPC :: System :: Module simple et j'ai écrit cet extrait de la mémoire et l'ai retourné :) -------- --- la suggestion avec STDERR à STDOUT renvoie toujours une chaîne vide et $? retourne "0" –

Répondre

0

La clé est de se rappeler que le serveur web exécute votre programme pas vous. Lorsque vous lancez ls ou lpc cela fonctionne parce que vous avez/bin et/usr/sbin dans votre PATH. Exécuter: quel lpc ... quand je le fais j'obtiens/usr/sbin/lpc ce qui veut dire que j'ai besoin de/usr/sbin dans mon PATH pour lancer lpc sans donner le chemin complet. Essayez d'ajouter la ligne:

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

à la fin de votre programme. Si le répertoire requis n'est pas présent, une chose que vous pouvez faire est d'ajouter:

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

ou quelque à votre programme avant tout système ou back-tique appelle

+0

vous êtes réellement totalement correct ..J'ai trouvé que le petit tidbid et les commandes comme lpc status fonctionneraient comme ceci ---- les commandes comme "service lpd restart" qui ont réellement besoin d'un accès root sont encore problématiques mais ma solution pour cela est d'avoir un petit perl deamon qui tourne attend sur une socket –