1

我正在尝试构建一个 SpamAssassin 测试,该测试使用 ClamAV 的 CLI 工具 sigtool 来检测附加的 MS Office 旧文件(如可能具有宏的 .xls 或 .doc)何时实际上具有可执行宏。

在 perl 中调用 sigtool 并传递一个文件名以像这样进行扫描很容易

my $filename = "email_attach";
my $scan = `/usr/bin/sigtool --vba="$filename"`;
if ($scan =~ /autoopen/i ) {
  print "Scanning $file: INFECTED VBA\n";
}

但是,作为 SpamAssassin 测试,我已经将电子邮件附件作为变量传递给我的测试。所以我不想花时间将每个附件写入磁盘然后告诉 sigtool 去阅读它。

我研究了整个第 16 章 Programming Perl 和 Perl Cookbook on Interprocess Communications 和 Process Management and Communication ,那里有大量信息,但我没有看到任何解决将您的内部 perl 程序数据作为输入传输到外部的内容正在寻找要作为命令行参数传递的路径/文件名的应用程序。

感谢您对如何实现这一点的任何想法。或者,如果有人知道一种更简单的方法来检测 MS Office 旧文件中的 VBA 宏或可执行文件,那也可以。

4

1 回答 1

3

sigtool需要一个文件名。在某些系统上,有一些方法可以获取管道的文件名,因此您仍然可以使用管道。然而,如果你这样做了,你最终会得到两个管道(一个孩子从中读取,一个孩子向其中写入),这是一团糟。

通常,您必须使用非阻塞 IO、异步 IO、select循环或线程,但 IPC::Run 帮我们这样做了!

进程通常以打开 3 个文件句柄开始:STDIN (fd 0)、STDOUT (fd 1) 和 STDERR (fd 2)。但是孩子也可以继承任意数量的其他句柄。下面创建一个绑定到孩子的 fd 3 的管道,并告诉孩子通过特定于 Linux 的虚拟文件系统从该管道读取。

use IPC::Run qw( run );
run [ '/usr/bin/sigtool', "--vba=/proc/self/fd/3" ], '3<', \$doc, '>', \my $scan;

使用临时文件非常简单,但 IPC::Run 让它感到羞耻!

于 2016-01-14T20:36:53.170 回答