【发布时间】: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':权限被拒绝
-
注意:我将 PHP 脚本更改为 shell_exec('sh /var/www/html/scripts/test.sh');正如@JazZ 建议的那样,这一次,来自 test.sh 的 Hi 出现在输出中,但仍然无法运行 bash 的第二行。
标签: php bash apache permissions centos