我知道有类似的问题已经回答,但我没有得到他们的帮助。 所以,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不会让我发布这个答案,因为我的声誉很低。
答案 0 :(得分:0)
您的网络服务器运行的用户是什么?检查用户是否能够运行/home/pi/spitest/RaspberryPi-mcp3008Spi/tempv1
(并切换到正确的目录)。
否则,您可能会发现在Web服务器中查找错误日志会告诉您更多有关哪些内容无效的信息。
答案 1 :(得分:0)
这些问题的最常见原因是相对路径的差异。由于这个原因,我倾向于使用绝对路径。
此外,我觉得您的下标可能会打印到STDERR
而不是STDOUT
。反引号仅捕获STDOUT,因此您需要在2>&1
my @output = `scriptName 2>&1`;
NB:重定向不适用于所有shell(我相信当我遇到类似问题时,tcsh不支持它)。 Bash接受重定向就好了。
答案 2 :(得分:0)
我怀疑你的脚本没有正确的Perl shebang作为它的第一行,因为当你从命令行启动它时你指定perl是解释器并且它可以工作,而你的web服务器似乎不是在perl下运行它所以它不起作用。
查找perl所在的位置
which perl
然后更改脚本的第一行以匹配位置,例如
#!/bin/perl
您的脚本还应该在正文之前输出HTML HEAD,顺便说一句。
事实上,只需编辑您的问题并向我们展示您的脚本。
<强> ADDED 强>
你的轻薄配置文件看起来如何?喜欢这个?
server.modules += ( "mod_cgi" )
$HTTP["url"] =~ "/cgi-bin/" {
cgi.assign = ( ".pl" => "/usr/bin/perl" )
}