Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP';重定向shell命令的输出;s exec()函数_Php_Linux_Apache_Shell - Fatal编程技术网

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

使用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'));

我试图重定向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'));  // 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