我是一台运行NGINX和PHP的Ubuntu 16.04机器。我想让www-data
用户(通过Web浏览器)能够访问将执行bash脚本(php-test.php
)或执行Linux CLI的PHP页面(script_test.sh
)命令使用shell_exec
或exec
。
我做了以下事情。
创建了我的bash脚本文件script_test.sh
#!/bin/bash
whoami
echo $USER
echo 'test'
exit
当我从CLI运行时,使用
./ script_test.sh
它确实有效,我可以看到在CLI中回显的信息。
然后我追求的目标是允许www-data用户通过NGINX在同一台机器上运行的PHP页面运行这个bash脚本。
我创建了我的php页面(php_test.php),它包含以下内容
<?php
chdir('/path/to/my/files/');
shell_exec('./script_test.sh'); // ATTEMPT RUN SCRIPT
shell_exec('/path/to/my/files/script_test.sh'); // ATTEMPT RUN SCRIPT
echo 'test 123'; // SIMPLE ECHO IN THE PHP PAGE
?>
然后运行以下命令来修改sudoers文件,为bash脚本提供www-data访问权限
sudo nano /etc/sudoers
我添加了以下行
www-data ALL=NOPASSWD: /path/to/my/files/script_test.sh
然后我确保脚本是可执行的,为了我的测试,不用担心安全性,我只是使用以下命令将其设置为777
sudo chmod 777 script_test.sh
从那里我打开一个Web浏览器并浏览到localhost(NGINX)Web服务器(php_test.php),我在页面上看到的唯一一件事就是&#39;测试123&#39;我从PHP回应...没有任何bash脚本似乎已经运行。我拖尾NGINX错误日志,并没有看到任何错误。
是否有其他日志可能包含此线索?
我还应该在这里查看什么?
答案 0 :(得分:0)
shell_exec()
的结果作为字符串返回。要在浏览器中显示它,只需添加echo。
<?php
chdir('/path/to/my/files/');
echo shell_exec('./script_test.sh'); // ATTEMPT RUN SCRIPT
echo shell_exec('/path/to/my/files/script_test.sh'); // ATTEMPT RUN SCRIPT
echo 'test 123'; // SIMPLE ECHO IN THE PHP PAGE
?>
请参见手册中的Return Values:
已执行命令的输出;如果发生错误,则为NULL或 该命令不产生任何输出。
答案 1 :(得分:-1)
你可以尝试使用passthru而不是shell_exec,看看输出是什么吗?
也试试这个,看看它是否显示在日志文件中:
if(file_exists('/path/to/my/files/script_test.sh')) { die('File not found!'); }
shell_exec("nohup /path/to/my/files/script_test.sh > /path/to/my/files/output.log &");
另外,您是否使用www-data用户运行PHP(检查您的fpm池)? 你在/ var / log / syslog或/var/log/auth.log上有任何错误吗? 您是否在更改sudo权限后重新启动了服务器?
su - www-data -c "whoami"
和su - www-data -s /bin/bash -c "whoami"
输出了什么?
su - www-data -s /bin/bash -c "/path/to/my/files/script_test.sh"
输出了什么吗?