从PHP脚本运行bash脚本

时间:2017-06-03 07:55:44

标签: php bash apache permissions centos

我在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“来自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)打开和关闭。

1 个答案:

答案 0 :(得分:1)

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

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