CGI脚本不执行bash命令,如'CP'

时间:2015-12-25 08:05:31

标签: linux bash apache raspberry-pi cgi

我有一个Web服务器(apache2)设置为执行带.cgi文件扩展名的文件。这适用于某些命令。但是,我需要它将文件/var/www/on.html复制到/var/www/a1.html的位置。

我正在使用Debian Linux。脚本如下:

#!/bin/bash
echo "Content-type: text/html"
echo "<html><head><title>Light on"
echo "</title>"
echo "<meta http-equiv='refresh' content='1; url=http://86.11.221.243' />"
echo "</head><body>"
echo "$(gpio mode 8 out) #this turns the light on"
echo "$(cp /var/www/on.html /var/www/a1.html)"
echo "</body></html>"

我正在使用cp复制带有绿色背景的html网页来替换具有黑色背景的文件。这用于指示LED a1的状态(第1行第1列)。

1 个答案:

答案 0 :(得分:3)

echo "$(cp /var/www/on.html /var/www/a1.html)"

$( ... )正在括号内运行命令,并被输出(到 stdout )取代命令。成功的cp没有任何输出。失败的cp stderr 发出错误消息,而不是 stdout 。在这两种情况下,效果都是echo ""(输出空行,即单个换行符)的效果,可能还有复制文件的附加副作用。该副本作为www-data用户(运行您的Web服务器的用户)运行....如果/var/www/不可写,则会失败(在我的系统/var/www/上拥有由root:root并且不是世界可写的,因此www-data无法写入其中。)

因此,无需在该echo行上cp。您可以将其替换为cp /var/www/on.html /var/www/a1.html ; logger cp got $?(但使用cp并不是很好,请参阅下文)

BTW,cp不是原子操作。如果两个这样的CGI进程同时运行会发生什么并不是完全定义的。也许您想强制使用ln -f原子操作)的硬链接而不是cp

您可以/var/www/拥有www-data,也可以全球可写。在这两种情况下,这都是一个安全漏洞(您可以在专用的内部网络服务器上提供,只能从您的家庭网络访问)。如果您能够负担得起/var/www/on.html/var/www/a1.html替换/var/www/mydir/on.html/var/www/mydir/a1.html(因此请更改引用它们的HTML代码),您只需拥有一个/var/www/mydir/目录和/或www-data

可写

您可以将shell脚本包装在setuid可执行文件中(例如代码一个小型C程序,它将execve(2)您的脚本)和chmod u+srx已编译的可执行文件。

您可以添加(至少为了简化调试)一些logger(1)命令到您的脚本(和/或一些syslog(3)到您的C程序包装它),然后查看{{1}下的消息}

BTW,在Rasberry Pi上,您可以用专用的C程序替换您的apache Web服务器(例如使用某些HTTP服务器库,如libonion

在浏览器端也可能考虑AJAX技术(可能与websockets结合使用)。