我有一个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列)。
答案 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结合使用)。