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

标签 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(列a行1)的状态。

最佳答案

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

$( ... ) 正在运行括号内的命令并被输出替换(至stdout ) 的命令。成功的 cp 没有任何输出。失败的 cpstderr 而不是 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

强制执行硬链接(hard link)

您可以使 /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/

相关文章:

linux - 创建自动子域?

c - Apache:多次 POST 后内容已损坏

linux - Meteor 的 Linux 发行版之间的差异

linux - 是否应该避免从 cfengine 策略中重新启动 Linux 主机?

linux - 从使用 wget 重定向的页面获取文件

bash - 如何查找和计算与给定字符串匹配的文件数?

linux - ubuntu中的脚本同时获取CPU温度和CPU使用率并保存到文件

apache - jquery 移动导航链接在第一次点击时不起作用

c++ - 交叉构建,链接问题

java - Windows 上的“主机名”等效项