1

我目前正在为一家工程公司开发基于 Linux 的单板计算机,我负责更新板中托管的本地配置网站。这个配置服务器的目的是让用户可以通过他们的网络浏览器连接到板并修改板内的设置。

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

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

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

其中 $1 是一个 + 或 - 后跟一个数字。这些是由网站上的下拉菜单生成的。

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

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

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

4

2 回答 2

2

分离权限是有充分理由的,尤其是在处理无状态协议时。darryn.ten 的答案是浪费时间 - 您授予网络服务器 uid 执行所有操作的权限 - 通过以 root 身份运行网络服务器,您的代码以更少的努力(并且同样不安全)获得相同的结果。

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

  • 验证论点
  • 链接时区

在示例 bekow 我使用 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
于 2012-06-11T15:07:11.683 回答
0

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

visudo

并添加以下内容

apache ALL=(ALL) NOPASSWD: ALL

前提是您的 apache 用户是 apache。

然后在命令中添加 sudo

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

并且命令应该被执行。

编辑:实际上不要这样做

于 2012-06-11T14:02:43.173 回答