PHP exec用于创建根符号链接的权限

时间:2012-06-11 12:58:51

标签: php linux permissions exec ln

我目前正在为一家工程公司开发基于Linux的单板计算机,我负责更新主板内部的本地配置网站。此配置服务器的目的是使用户可以通过其Web浏览器连接到电路板并修改电路板内的设置。

我尝试创建的当前设置涉及设置电路板硬件时钟的时区。不幸的是,董事会处理时区的方式是在/ usr / share / zoneinfo / to / etc / localtime中的文件之间建立系统链接。

我的问题是我需要从网站运行以下命令:

ln -s /usr/share/zoneinfo/Etc/GMT$1 /etc/localtime

其中$ 1是+或 - 后跟一个数字。这些是通过网站上的下拉列表生成的。

当我尝试从网站的PHP运行此命令时,会出现我的主要问题。通过捕获exec命令的响应,我发现我没有获得足够的权限来创建/修改符号链接。我尝试过创建bash脚本并从PHP运行它的方法。我也尝试从PHP运行基于C的可执行文件。

注意事项:用户密码是随机生成的,嵌入式Linux软件包中不包含sudo。

我的目标是避免因为安全问题而以root用户身份运行Apache服务器。有没有办法给单个脚本(可能是临时的)权限来运行命令,或者任何其他类型的解决方法?

2 个答案:

答案 0 :(得分:2)

分离权限是有充分理由的,特别是当您处理无状态协议时。 darryn.ten的答案是浪费时间 - 你给网络服务器uid做任何事情的许可 - 你通过以root身份运行web服务器来获得相同的结果以减少工作量(同样不安全)。

我建议将逻辑封装在以root身份运行的程序中,只有:

  • 验证参数
  • 链接时区

在示例中,我使用的是bash,它需要sudo以root身份执行 - 但如果你用C语言编写,那么你可以启用setuid位,它将以文件所有者的权限运行程序(这赢了使用shell脚本)。不确定setuid与lua的行为如何 - 这将是嵌入式系统的明显候选者。

#!/bin/bash

# NB must be validated under executing user privilege

REQUEST=`echo $1 | grep -P '/^([\+\-0-9]+)$/'`"; 
ln -s /usr/share/zoneinfo/Etc/GMT$(REQUEST} /etc/localtime

答案 1 :(得分:0)

您需要在安装中添加sudo,然后

visudo

并添加以下内容

apache ALL=(ALL) NOPASSWD: ALL

如果你的apache用户是apache。

然后将sudo添加到命令

sudo ln -s /usr/share/zoneinfo/Etc/GMT$1 /etc/localtime

并且命令应该执行。

编辑:实际上不要这样做