如何从 apache 运行 shell 命令(通过 php)

如何从 apache 运行 shell 命令(通过 php)

我使用的是 redhat 6,我需要从 web 服务器(apache -> 通过 php )运行以下 shell 命令,这些命令基本上是移动和覆盖文件、终止进程并启动另一个进程。显然,由于某些原因,所有操作都被拒绝,所以我想知道是否有任何方法可以执行它们(例如,我应该给 apache 什么权限以及如何授予)

echo  shell_exec('mv -f /etc/resolv.test /etc/resolv.conf');
echo  shell_exec('killall horas');
echo  shell_exec('/xg/eng/sbin/startme &> /dev/null &');

错误日志是 mv: 无法移动/etc/resolv.test' to/etc/resolv.conf': 权限被拒绝 horas(2105): 操作不允许 horas: 没有进程被终止

答案1

嗯,我知道 apache 在 apache 下运行,但我认为问题是如何赋予 apache 更多权限,以便它可以执行所有这些命令

典型的做法是使用sudoNOPASSWD 授予 Apache 访问权限。您需要对此格外谨慎,因为如果配置错误,这可能会非常危险。例如

apache    ALL=(ALL) NOPASSWD: killall horas

可能会有效。您可能还想将整个内容写成“包装器”脚本,然后只授予 apache sudo 对该脚本的访问权限。(另一个回复也推荐这个。)

请记住,你授予 apache 执行权限提升。这可能是一个 root 级远程漏洞。在部署脚本之前对其进行测试,并确保调查使用基本身份验证和/或 IP 允许保护对页面的访问。研究替代解决方案可能对您也有更好的帮助。Apache 真的需要管理您的 resolv.conf 吗?cronjob 可以执行吗killall

答案2

Apache 进程通常以特殊用户身份运行(在 Redhat 中通常为“apache”)。首先找出这一点。然后,您需要检查该用户是否被允许执行该操作(文件/目录权限)。

让运行 Web 服务器的用户拥有执行只有 root 才能执行的敏感脚本的大权限是非常危险的。我不清楚您的具体情况,但从代码片段来看,我会采取更谨慎的做法,比如有一个频繁运行(每分钟一次)的 cron 脚本(可能适用于 root 用户),它只检查由 php 脚本生成的某个文件是否存在 - 如果该文件存在,它将执行任务并删除该文件。

答案3

我通常会做以下其中一件事:

  • 让 php 更新数据库,并以正确的用户身份运行 cronjob 来检查该数据库。这会带来延迟,但最安全
  • 将所有这些命令包装在 shellscript 中并让 apache 运行sudo -u correctuser_here /path/to/script,当然还要为 /etc/sudoers 添加权限:www-data ALL=correctuser /path/to/script
  • 我最喜欢的是:使用排队软件(我偏爱 beanstalk,因为它很简单):让 php 将一个项目添加到队列中,并让后台守护进程不断检索和处理项目。

在您的用例中,选项 2 听起来是正确的做法。

相关内容