首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PHP的exec()函数重定向shell命令的输出

使用PHP的exec()函数重定向shell命令的输出
EN

Stack Overflow用户
提问于 2017-06-26 20:54:25
回答 1查看 1.5K关注 0票数 1

我试图重定向shell命令的输出,如下所示:

代码语言:javascript
复制
# echo here > /tmp/output

我需要在apache使用exec()函数执行的PHP脚本中执行此操作:

代码语言:javascript
复制
var_dump(exec('echo here > /tmp/output'));  // string (0) "", no file created

上面的命令不创建文件,返回的退出代码为0。

我可以验证PHP能够使用exec执行命令,如下所示:

代码语言:javascript
复制
var_dump(exec('echo here'));  // string(4) "here"

我尝试在php shell中以apache用户的身份执行这段代码,它的工作原理是:

代码语言:javascript
复制
# su -s /bin/bash -c 'php -a' apache
php > var_dump(exec('echo here > /tmp/output'));  // file is created

我尝试过重定向stderr以及stdout:

代码语言:javascript
复制
var_dump(exec('echo here 2>&1 /tmp/output'));  // string(0) "", no file created

最后,我尝试将stderr从整个命令重定向回exec():

代码语言:javascript
复制
var_dump(exec('echo here > /tmp/output 2>&1')); // string(0) "", no file created

基于上述步骤,在我看来,这个问题必须与apache调用php有关,因为它作为apache用户在php shell上运行很好。

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-05 17:07:53

我解决了我的问题。问题是apache被配置为使用私有临时目录:

PrivateTmp=采用布尔参数。如果为true,则为已执行的进程设置一个新的文件系统命名空间,并在其中挂载私有/tmp和/var/tmp目录,这些目录不是由名称空间外的进程共享的。这对于保护对进程临时文件的访问非常有用,但使得进程之间无法通过/tmp或/var/tmp共享。服务停止后,所有由服务创建的临时数据都将被删除。默认为false。

结果,我找错了脚本输出的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44768521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档