【发布时间】:2017-08-30 12:45:28
【问题描述】:
我想运行一个带反引号的 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 它只是不想这样做:/
【问题讨论】:
-
您的内容类型错误。应该是
text/plain(这不是你的问题,我只是认为你应该知道)。 -
“返回一个空字符串”并不意味着“没有问题”。其他一些尝试是捕获命令的标准错误 (
$result = qx(lpc status all 2>&1)) 并输出退出状态 ($?)。 -
啊该死的..在我的原件中是正确的..最新的一个是我的 IPC::System::Simple 模块的测试用例,我从内存中编写了这个 sn-p 并将其转过来: ) ----------- 对 STDOUT 的 STDERR 建议仍然返回一个空字符串和 $?返回“0”
-
没有 sudo 的 shell 脚本是否工作?如果不是,你为什么期望执行命令的 perl 脚本可以在没有的情况下工作?如果是这样,你为什么要使用 sudo?这对我来说似乎是一个权限问题。
-
是的,它可以在没有 sudo 的情况下工作