在system / exec / open中使用$ Config {perlpath}是否安全?

时间:2016-04-20 01:13:00

标签: perl

假设我有以下代码打开文件句柄:

open my $fh, "command1 | command2 |";

我发现command1可能会输出command2无法处理的问题,因此我尝试在command1command2之间插入perl过滤器来处理它们:

use Config;
open my $fh, "command1 | $Config{perlpath} -ple 'blah blah' | command2 |";

我的问题是:

  1. 可以直接在系统调用中使用$Config{perlpath}吗?
  2. 调用自己的perl二进制文件似乎很疯狂。还有更好的解决方案吗?
  3. 由于

1 个答案:

答案 0 :(得分:1)

  

在系统调用中直接使用$ Config {perlpath}是否可以?

相对。它与其他代码一样可移植(它已经依赖于在unix-ish上运行)。有一些安全问题,但我会说不是一个非常大的问题,因为可能影响该变量值的人已经有可能造成破坏的范围。 $^X在这方面可能更安全。您可能希望尝试使用String::ShellQuote引用它只是为了安全,因为您无法绕过管道中的shell。

  

调用自己的perl二进制文件似乎很疯狂。有没有更好的解决方案?

取决于您对“更好”的定义。肯定有另一种方法,分别运行command1command2,在原始perl进程中处理command1的输出,将其传递给command2,然后阅读command2的输出。但是,你必须要小心你是如何做到的。有两种安全的方式。

第一种方法更容易,但需要更多时间和内存:首先运行command1,将其所有输出读取并处理为字符串,然后运行command2,将缓冲输出作为输入。执行此操作的最佳方法是使用IPC::Run来处理command2的输入和输出(也可能是两个命令,只是为了保持一致性);如果您尝试将所有数据打印到command2的输入句柄然后读取所有输出就可以死锁,但IPC :: Run会在必要的情况下交错读取和写入,并给你一个很好的简单的界面。

第二种方式更复杂但行为更接近原始:您需要某种异步框架,如IO::AsyncPOE,使用其类进行流程构建,并设置处理程序进行通信在它们之间,进行过滤,并收集输出。

Here's一个经过测试的玩具示例(gist因为它是几个代码的屏幕),其功能相当于ls | perl -pe '$_ = uc' | rev,除了在父perl进程中运行的管道的中间部分。你可能永远不会使用它,但我认为值得说明。