在Perl中使用系统命令来使用gzip

时间:2016-11-03 21:05:55

标签: perl compression

我有一些压缩文件(.gz格式),我想自动化这个过程。这就是我所拥有的:

    !# /usr/bin/perl -w
    use strict;

    my $input1 = $ARGV[0];
    my $unzip_command = 'gzip -d $input1';
    system $unzip_command;

我收到一个错误,要求使用-f强制解压缩(尝试过,只是挂起)。你能发现我的语法错误吗?

2 个答案:

答案 0 :(得分:2)

如果希望插值变量,请使用双引号。

my $unzip_command = "gzip -d $input1";

否则你将执行命令&#; gzip -d $ input1'而不是' gzip -d myfile.gz'。

在这种情况下,系统将命令传递给shell,它将$ input1解释为shell变量。当然那不存在。

答案 1 :(得分:2)

正如this answer中所述,您必须使用双引号$input1进行插值(展开)。

但是

您的脚本容易受到代码注入。考虑这种情况(假设您的脚本名称为decompress.pl):

$ ./decompress.pl "foo.gz; rm -rf /"

这将最终执行

gzip -d foo.gz; rm -rf /

请阅读有关可以调用的两种模式system:要么带有字符串(然后由shell解释),要么带有参数数组(绕过shell及其解释)。

最好在这里使用数组模式:

#!/usr/bin/perl
use strict;
use warnings;

my $input1 = $ARGV[0];
my @unzip_command = ('gzip', '-d', $input1);
system( @unzip_command );

(顺便说一下:你的生物线上有一个拼写错误。它不是!#/usr/bin/perl而是#!…。请粘贴你的代码而不是重新输入代码来避免输入错误。)