【问题标题】:Perl system command output visible when running from console but not visible when running through browser CGIPerl 系统命令输出在从控制台运行时可见,但在通过浏览器 CGI 运行时不可见
【发布时间】:2014-05-26 16:26:09
【问题描述】:

我知道有人回答了类似的问题,但我没有得到他们的帮助。 所以,Perl 命令:

$temp=`/home/pi/spitest/RaspberryPi-mcp3008Spi/tempv1`;
print $temp;

从 linux 控制台运行时正确显示程序 tempv1 的输出:

pi@raspberrypi /var/www/cgi-bin $ ls -la temp.pl
-rwxrwxr-x 1 root root 193 Apr 12 15:09 temp.pl
pi@raspberrypi /var/www/cgi-bin $ perl temp.pl 
Content-Type: text/plain

<html><body>20.4</body></html>pi@raspberrypi

但是当我从浏览器运行它时它不会显示这个特定的输出:

http://192.168.1.102/cgi-bin/temp.pl

output: <html><body></body></html>

我的服务器是 lighttpd,它的用户和组都是 www-data。 感觉这是一个许可的事情,但我想听听你的意见。

解决方案编辑: 一开始我看不到与 /dev/spidev* 设备的连接,但现在很明显问题就在那里(文件权限)。感谢大家的帮助,对于最初的误导信息,我深表歉意:

我想从 Perl 脚本调用的系统命令使用这些 spidev* 设备与芯片通信。当我从 CLI (user=pi) 调用此系统命令 (应用程序) 时,它运行良好,但是当它作为通过 Web 服务器 (user=www-data) 启动的 Perl 脚本的一部分执行时,应用程序失败了,显然是因为用户 www-data 没有访问 /dev/spidev* 的权限。

我的解决方法是将 /dev/spidev* 设备添加到 www-data,但也许我必须找到更干净的解决方案。

太糟糕了,stackoverflow 不允许我发布这个答案,因为我的声誉很低。

【问题讨论】:

  • 你的 Perl 程序中只有这两行吗?
  • 它还有其他几行,但它以“#!/usr/bin/perl”开头
  • 你能su到www-data看看你能不能运行这个脚本吗?
  • 像真正的可执行文件一样执行,无需 perl。
  • 好的,找到了解决方案。我想在 Perl 脚本中执行的系统命令(程序)使用了一个 SPI 设备(/devf/spidev0.0),来自 CLI 的用户 pi 可以访问,但用户 www-data 没有。

标签: perl cgi system


【解决方案1】:

您的网络服务器以什么用户身份运行?检查用户是否能够运行/home/pi/spitest/RaspberryPi-mcp3008Spi/tempv1(并切换到正确的目录)。

否则,您可能会发现查看您的网络服务器错误日志会告诉您更多关于什么不工作的信息。

【讨论】:

  • 服务器的用户和组都是www-data。这个用户应该可以访问所有具有-rwxrwxr-x 或-rwxrwxr-x 权限的目录和文件,对吧?
  • @user3526774 你刚才所说的并没有真正提供任何有用的反馈。我们仍然不知道您的tempv1 是否设置了正确的权限,也不知道您是否理解所说的内容。理想情况下,您应该说“tempv1 程序具有 -rwxrwxr-x 权限,应该包括 www-data,对吧?”
  • @Sobrique 支持 Sobrique,因为他的回答让我看到从 CLI 执行系统命令(应用程序)并不意味着相同的用户或相同的权限。
  • Chowing /dev 可以工作,但这可能不是最好的主意 - 你让你的网络服务器用户广泛访问它。我建议查找如何配置 sudo 以提供有限范围的特权访问。
【解决方案2】:

此类问题的最常见原因是相对路径的差异。出于这个原因,我倾向于使用绝对路径。

此外,在我看来,您的下标可能打印到STDERR 而不是STDOUT。反引号仅捕获 STDOUT,因此您需要在 2&gt;&amp;1 的帮助下进行重定向

my @output = `scriptName 2>&1`;

注意: 重定向不适用于所有 shell(我相信当我遇到类似问题时,是 tcsh 不支持它)。 Bash 接受重定向就好了。

【讨论】:

  • 我的“下标”不是脚本,它是用 C++ 编写的程序,用 g++ 编译并通过简单的 cout 输出文本。
  • @Jarmund 他使用的是绝对路径,从控制台运行时得到标准输出。
【解决方案3】:

我怀疑你的脚本没有正确的 Perl shebang 作为它的第一行,因为当你从命令行启动它时,你指定 perl 是解释器并且它可以工作,而你的网络服务器似乎没有在 perl 下运行它所以它不起作用。

查找 perl 所在的位置

which perl

然后更改脚本的第一行以匹配位置,即类似

#!/bin/perl

您的脚本还应该在正文之前输出一个 HTML HEAD,顺便说一句。

事实上,只需编辑您的问题并向我们展示您的脚本即可。

添加

您的轻量级配置文件看起来如何?像这样?

server.modules += ( "mod_cgi" )

$HTTP["url"] =~ "/cgi-bin/" {
      cgi.assign = ( ".pl" => "/usr/bin/perl" )
}

【讨论】:

  • 哪个 perl 输出正确的 shebang,即“#!/usr/bin/perl”,我已经将它包含在我的脚本中
  • 第二部分不存在,以“$HTTP”开头的块。我应该附加它吗?
  • 是的,然后重启lighttpd。
  • 我试过了,但结果相同。我到 cgi-bin 的绝对路径是 /var/www/cgi-bin,这有关系吗?
  • 很高兴你们现在都在工作。感谢@TLP 和mpapec。
猜你喜欢
  • 1970-01-01
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 2014-05-25
  • 2017-08-06
  • 2021-10-28
相关资源
最近更新 更多