我尝试了以下示例,如:
$ php -r 'require_once($argv[1]);' <(echo "hello")或者:
$ php -r 'file_get_contents($argv[1]);' <(echo "hello")两者都失败了,比如:
PHP警告: require_once(/dev/fd/63):未能打开流:第1行命令行代码中没有这样的文件或目录 PHP警告: file_get_contents(/dev/fd/63):未能打开流:第1行命令行代码中没有这样的文件或目录
或者:
$ php -r 'file_get_contents($argv[0]);' < <(echo "hello")在以下几个方面都失败了:
PHP致命错误:(include_path='.:/usr/share/pear:/usr/share/php') ():第1行命令行代码中的require_once():打开失败所需的'-‘
上面的尝试是受drush命令启发的,例如:
$ drush --early=<(echo print 123';') ""
[warning] require_once(/dev/fd/63): failed to open stream: No such file or directory preflight.inc:58在这里,我可以从文件描述符注入动态PHP代码(每次不创建单独的文件),以便在引导主代码之前执行代码。
其他类似的命令工具工作正常:
$ cat <(echo "hello")
hello或者:
$ python -c "import sys; print sys.stdin.readlines()" < <(echo "hello")
['hello\n']我已经找到了这个PHP bug和这一个,但是它们很久以前就已经修复了,我使用的是5.6.22。
我是否可以通过使用简单的一行程序从进程替换(从文件描述符(如/dev/fd)中读取数据)来欺骗PHP?
发布于 2016-08-08 14:04:39
错误消息给出了一个很好的提示: PHP找不到给定的文件。
等等,什么文件?好吧,让我们记住过程替代是什么:
进程替换是一种重定向形式,其中进程的输入或输出(某些命令序列)显示为临时文件。
所以,当你打印论点时,你是这样提供的:
$ php -r 'print $argv[1];' <(echo "a")对我来说,它返回以下临时文件:
/dev/fd/63因此,是的,您可以使用PHP的进程替换,但不能用于此。
如果要使用命令的输出作为参数,只需使用$()来展开它:
$ php -r 'print $argv[1];' "$(echo "hello man")"
hello manhttps://stackoverflow.com/questions/38831168
复制相似问题