2017-08-16 246 views
1

我正在使用PHP编写API来通过POST将JSON参数传递给BASH脚本。下面是我在做什么蒸馏版本:使用PHP shell_exec()来执行BASH脚本,无法写入文件

<?php 

$params = json_decode(file_get_contents('php://input'), true); 

$cmd = "/bin/bash /path/to/myscript " . $params["value1"] . " " . $params["value2"] . " " . $params["value3"]; 
$output = "Command: " . $cmd . "\n\nResponse: " . shell_exec($cmd); 

print($output); 

?> 

“的MyScript”是一个简单的测试脚本如下:

#!/bin/bash 

echo -e "Executing script...your parameters are: [$1] [$2] [$3]\n" 
echo -e "test" > /tmp/test.txt 

执行该脚本,我得到的第一个回显显示参数已成功通过。但是,在写入文件系统的脚本(第二个回显)中尝试做任何事情都不会发生。就好像权限是一个问题,但我已经确保写入'apache'用户拥有完全权限的目录。我也尝试添加Apache和我的脚本命令sudoers和通过sudo密码运行,没有运气。通过在我的php和bash脚本中添加适当的调试命令,我已经证实路径是明确和正确的,用户是正确的,正如已经发布的数百万个其他问题所建议的。如果我从命令行运行脚本,脚本显然工作正常。如果我使用sudo -u apache来运行脚本,它也可以工作(并且可以写入文件系统),所以我知道权限不是问题。我被卡住了。有任何想法吗?

编辑更多信息:我也尝试禁用SELinux,验证所有者/权限,尝试写入其他具有777权限的目录,并执行脚本从命令行(PHP以外)与Apache用户,所有没有的问题。只有在shell_exec内执行时,我才能写入任何文件系统。

如果有帮助,我在Centos7上。

+0

可以请你连接到OS为用户Apache和测试命令,告诉我们了放? –

+1

什么是ls -lsa输出为myscript? –

+0

您是否正在执行SELinux模式的系统上运行? apache用户可能没有使其能够写入/ tmp的策略。 –

回答

0

罪魁祸首最终成为了SELinux。禁用后,我可以写入特定的目录,但仍然不是其他人。不知道为什么,但即使禁用SELinux,当通过shell_exec执行脚本时,我无法写入/ tmp,尽管我可以通过cmd行执行。但是,shell_exec可以写入我的httpd根目录没有问题。

0

检查你的php.ini,看看是否设置了open_basedir。这会限制你的php脚本在该目录/子目录之外写入。

我有同样的问题,当我启用它,无法写入到/ tmp

grep open_basedir /etc/php/7.0/apache2/php.ini # Ubuntu 

http://php.net/manual/en/ini.core.php#ini.open-basedir

+0

感谢您的建议,但该选项未在我的php.ini中设置。 – Antennae