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