我目前正在为一家工程公司开发基于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服务器。有没有办法给单个脚本(可能是临时的)权限来运行命令,或者任何其他类型的解决方法?
答案 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
并且命令应该执行。
编辑:实际上不要这样做