[实践OK]协程 shell_exec 如何捕获标准错误流

jackxiang 2020-11-3 14:30 | |
问题:用Co\System::exec()执行了一个不存在的命令时,错误信息会直接打印到屏幕,而不是返回错误信息。
怎么办:实际上Swoole提供的System::exec()行为上与PHP的shell_exec是完全一致的,我们写一个shell_exec的同步阻塞版本,执行后发现同样拿不到标准错误流输出的内容,会被直接打印到屏幕。
答案:  使用proc_open+hook实现。
现象:


==================================================================
#php tt.php
PHP Warning:  shell_exec() has been disabled for security reasons in /data/www/testswoole/tt.php on line 2
NULL

估计整成错误输出了,于是用:
php tt.php >/dev/null 2>&1

果然,怎么办?加入管道,将此错误指向新的文件描述符。



前置:打开php.ini里面的proc_open禁用函数。
#cat t.php


#php t.php
array(3) {
  [0]=>
  resource(4) of type (stream)
  [1]=>
  resource(5) of type (stream)
  [2]=>
  resource(6) of type (stream)
}
string(31) "sh: unknown: command not found
"
command returned 32512

代码来自rango:https://mp.weixin.qq.com/s/z7SPy-tV3hsQqLXZ-tKlZw

作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/10747/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!


最后编辑: jackxiang 编辑于2020-11-3 14:31
评论列表
发表评论

昵称

网址

电邮

打开HTML 打开UBB 打开表情 隐藏 记住我 [登入] [注册]