【问题标题】:Run bash script from PHP script从 PHP 脚本运行 bash 脚本
【发布时间】:2017-11-04 14:55:38
【问题描述】:

我在 CentOS 上运行 Apache 服务器,需要从 PHP 页面运行一些 bash 脚本。运行不需要 PHP 文件写入或执行权限的命令可以正常工作(例如 shell_exec('ls /var/www/html/scripts/')),但我在运行以下命令时遇到问题确实需要写入或执行权限。例如,这个命令什么都不做:

<?php
   $output = shell_exec('/var/www/html/scripts/test.sh');
   echo $output;
?>

我将 apache 用户设为所有者并授予脚本目录必要的权限:

drwxr-xr-x. 2 apache apache   21 Jun  3 09:54 scripts

和test.sh文件一样可以看到,但是没有锁。

-rwxr-xr-x. 1 apache apache 51 Jun  3 09:54 test.sh

我也尝试在 PHP 文件中使用 sudo 命令,并将下面的行添加到 Sudoers 文件的末尾,但没有任何改变。

apache ALL=NOPASSWD: /var/www/html/scripts/test.sh

我还检查了 PHP safe_mode 是关闭的并且在 php.ini 文件中没有限制:

disable_functions =

非常感谢您的帮助。

注意:

我编辑了我的 bash 脚本并添加了 sudo,如下所示:

#!/bin/bash
echo "Hi from test.sh";
sudo touch /var/www/html/scripts/file.log;

现在,当我以 apache 用户身份使用此命令运行文件时,它运行成功:

su -s /bin/sh apache -c "/var/www/html/scripts/test.sh"

但是通过 php 网页它只运行 echo "Hi from test.sh";线。当我检查日志时,下面有几行用于运行上面的命令:

su: pam_unix(su:session): session opened for user apache by root(uid=0)
sudo:  apache : TTY=unknown ; PWD=/var/www/html ; USER=root ; COMMAND=/bin/touch fromweb.log
su: pam_unix(su:session): session closed for user apache

以及从php网页运行时生成的日志:

sudo:  apache : TTY=unknown ; PWD=/var/www/html/scripts ; USER=root ; COMMAND=/bin/touch fromweb.log

缺少 pam_unix(su:session) 打开和关闭。

【问题讨论】:

  • 您是否收到任何错误消息?
  • 注意apache默认用户是www-data
  • @JazZ 没有特殊错误消息,因为错误报告已关闭,但是当我从命令提示符运行 bash 文件时,会发生以下错误:su -s /bin/sh apache -c "scripts/test. sh" 来自 test.sh 的你好 touch:无法触摸 'file.log':权限被拒绝
  • Run Bash Command from PHP的可能重复
  • 注意:我将 PHP 脚本更改为 shell_exec('sh /var/www/html/scripts/test.sh');正如@JazZ 建议的那样,这一次,来自 test.sh 的 Hi 出现在输出中,但仍然无法运行 bash 的第二行。

标签: php bash apache permissions centos


【解决方案1】:

我发现了问题所在。这是因为 Linux SELinux 特性。此功能应用最低权限策略并拒绝在 Linux 上运行任何不必要的命令。禁用此功能后,bash 脚本运行成功。为此,请编辑文件 /etc/selinux/config 并将 SELINUX=enforcing 更改为 SELINUX=disabled 并重新启动系统。但是,出于安全原因,不建议这样做。您可以检查下面的链接以仅创建一些例外而不是完全禁用 SELinux。

https://wiki.centos.org/HowTos/SELinux

【讨论】:

  • 太棒了!感谢您发布您的解决方案。祝你好运。
  • @JazZ 感谢您的帮助
  • 欢迎 抱歉无法为您提供此解决方案。
最近更新 更多