使用PHP';重定向shell命令的输出;s exec()函数
我试图重定向shell命令的输出,如下所示:使用PHP';重定向shell命令的输出;s exec()函数,php,linux,apache,shell,Php,Linux,Apache,Shell,我试图重定向shell命令的输出,如下所示: # echo here > /tmp/output 我需要在apache使用exec()函数执行的PHP脚本中执行此操作: var_dump(exec('echo here > /tmp/output')); // string (0) "", no file created 上述命令不创建文件,返回的退出代码为0 我可以验证PHP是否能够使用exec执行命令,如下所示: var_dump(exec('echo here'));
# echo here > /tmp/output
我需要在apache使用exec()函数执行的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():
基于以上步骤,我认为这个问题一定与apache调用php有关,因为它可以作为apache用户从php shell运行
非常感谢您的帮助 我解决了我的问题。问题是apache被配置为使用私有临时目录: PrivateTmp=接受一个布尔参数。如果为true,则设置一个新文件 已执行进程和挂载私有/tmp的系统命名空间 和/var/tmp目录,进程不共享这些目录 在名称空间之外。这有助于确保访问的安全性 进程的临时文件,但在进程之间进行共享 不可能通过/tmp或/var/tmp。由服务创建的所有临时数据 将在服务停止后删除。默认为false
因此,我在错误的位置查找脚本的输出。我解决了我的问题。问题是apache被配置为使用私有临时目录: PrivateTmp=接受一个布尔参数。如果为true,则设置一个新文件 已执行进程和挂载私有/tmp的系统命名空间 和/var/tmp目录,进程不共享这些目录 在名称空间之外。这有助于确保访问的安全性 进程的临时文件,但在进程之间进行共享 不可能通过/tmp或/var/tmp。由服务创建的所有临时数据 将在服务停止后删除。默认为false
因此,我在错误的位置查找脚本的输出。是否要保留输出?否,输出不相关。真正的目标是使用mysqldump在/tmp中写入文件,这就是失败的地方。echo只是一个简化的测试用例。在
/tmp
之外的其他地方尝试过,如果我不小心,linux删除我的文件时会出现问题。请检查php cli和您从Apache使用的模块或FCGI是否共享相同的php.ini
文件。还要检查您的设置是否使用了PHP-FPM和一个特定的池,该池将设置一个与主Apache配置不同的用户/组。您可以通过运行$processUser=posix_getpwuid(posix_geteuid())来确认这一点;打印$processUser['name']代码>在这两种情况下。是否要保留输出?否输出与此无关。真正的目标是使用mysqldump在/tmp中写入文件,这就是失败的地方。echo只是一个简化的测试用例。在/tmp
之外的其他地方尝试过,如果我不小心,linux删除我的文件时会出现问题。请检查php cli和您从Apache使用的模块或FCGI是否共享相同的php.ini
文件。还要检查您的设置是否使用了PHP-FPM和一个特定的池,该池将设置一个与主Apache配置不同的用户/组。您可以通过运行$processUser=posix_getpwuid(posix_geteuid())来确认这一点;打印$processUser['name']代码>在这两种情况下。
var_dump(exec('echo here > /tmp/output 2>&1')); // string(0) "", no file created