我正在尝试重定向shell命令的输出,如下所示:
# echo here > /tmp/output
我需要使用exec()函数从apache执行的PHP脚本中执行此操作:
var_dump(exec('echo here > /tmp/output')); // string (0) "", no file created
上述命令不会创建文件并返回退出代码为0。
我可以验证PHP是否能够使用exec执行命令,如下所示:
var_dump(exec('echo here')); // string(4) "here"
我尝试从作为apache用户运行的php shell中执行此代码,并且它可以工作:
# su -s /bin/bash -c 'php -a' apache
php > var_dump(exec('echo here > /tmp/output')); // file is created
我尝试重定向stderr以及stdout:
var_dump(exec('echo here 2>&1 /tmp/output')); // string(0) "", no file created
最后,我尝试将stderr从整个命令重定向回exec():
var_dump(exec('echo here > /tmp/output 2>&1')); // string(0) "", no file created
基于上面的步骤,在我看来,问题必须与apache调用php有关,因为它可以作为apache用户从php shell运行良好。
非常感谢任何帮助!
答案 0 :(得分:0)
我想出了我的问题。问题是apache被配置为使用私有临时目录:
PrivateTmp =采用布尔参数。如果为true,则设置新文件 已执行进程的系统命名空间,并挂载private / tmp 其中的/ var / tmp目录,不由进程共享 在命名空间之外。这对于安全访问非常有用 进程的临时文件,但在进程之间进行共享 通过/ tmp或/ var / tmp是不可能的。服务创建的所有临时数据 服务停止后将被删除。默认为false。
结果我在错误的位置查找我的脚本输出。