我有一个 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(列a行1)的状态。
最佳答案
echo "$(cp /var/www/on.html /var/www/a1.html)"
$(
... )
正在运行括号内的命令并被输出替换(至stdout ) 的命令。成功的 cp
没有任何输出。失败的 cp
向 stderr 而不是 stdout 发出错误消息。在这两种情况下,效果都是 echo ""
(输出一个空行,即一个换行符),可能还有复制文件的额外副作用。并且该副本作为 www-data
用户(运行您的网络服务器的用户)运行....如果 /var/www/
不可写,则会失败它(在我的系统上 /var/www/
属于 root:root
并且不是世界可写的,所以 www-data
不能写入它)。
因此,不需要在特定的 cp
行上有 echo
。您可以将其替换为 cp/var/www/on.html/var/www/a1.html ; logger cp got $?
(但是使用cp
不是很好,见下文)
顺便说一句,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 程序包装它),然后查看 /var/log/
顺便说一句,在 Rasberry Pi 上,您可以用专用的 C 程序替换 apache 网络服务器(例如,使用一些 HTTP 服务器库,如 libonion)
也许还可以考虑AJAX技术(可能结合 websockets )在浏览器端。
关于linux - CGI 脚本不执行 bash 命令,例如 'CP',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34461124/