【问题标题】:Perl CGI Script backticks with rootPerl CGI Script 带 root 的反引号
【发布时间】: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 的情况下工作

标签: perl cgi backticks


【解决方案1】:

关键是要记住,Web 服务器正在运行您的程序,而不是您。当您运行 ls 或 lpc 时,它可以工作,因为您的 PATH 中有 /bin 和 /usr/sbin。 Run: which lpc ... 当我这样做时,我得到 /usr/sbin/lpc 这意味着我需要在我的 PATH 中使用 /usr/sbin 才能在不提供完整路径的情况下运行 lpc。尝试添加该行:

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

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

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

或在任何系统或反引号调用之前对您的程序进行一些这样的操作

【讨论】:

  • 你实际上是完全正确的..我发现还有一点点花絮,像 lpc status 这样的命令都会像这样工作----像“service lpd restart”这样实际上需要root访问权限的命令仍然存在有问题,但我的解决方案是运行一个等待套接字的小型 perl 守护程序
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 2017-02-26
  • 2014-12-19
  • 2017-01-29
  • 2019-10-28
  • 1970-01-01
  • 2014-06-19
相关资源
最近更新 更多