我可以从stdin运行Perl脚本吗?

时间:2009-10-14 10:10:01

标签: perl

假设我有一个Perl脚本,即mytest.pl。我可以通过像cat mytest.pl | perl -e这样的东西来运行它吗?

我想这样做的原因是我有一个加密的perl脚本,我可以在我的c程序中解密它,我想在我的c程序中运行它。由于存在安全问题,我不想将解密的脚本写回硬盘,所以我需要在内存中运行这个perl脚本。

这个问题与cat命令无关,我只是想知道如何将perl脚本提供给stdin,并让perl解释器运行它。

5 个答案:

答案 0 :(得分:5)

perl < mytest.pl 

应该在任何shell中做到这一点。它调用perl并通过shell重定向操作符<提供脚本。

但是,正如所指出的那样,似乎有点不必要。为什么不用

启动脚本
#!/usr/bin/perl

或者

#!/usr/bin/env perl

? (已修改以反映您的Perl和/或env路径)

请注意Useless Use of Cat Award。每当我使用cat时,我都会停下来思考shell是否可以为我提供此功能。

答案 1 :(得分:4)

perl mytest.pl 

应该是正确的方法。你为什么要做不必要的事?

答案 2 :(得分:3)

有时需要执行perl脚本并将其传递给参数。 STDIN构造perl input_file.txt < script.pl将不起作用。使用How to assign a heredoc value to a variable in Bash中的提示,我们使用“here-script”克服了这个问题:

#!/bin/bash
read -r -d '' SCRIPT <<'EOS'
$total = 0;

while (<>) {
    chomp;
    @line = split "\t";
    $total++;
}

print "Total: $total\n"; 
EOS

perl -e "$SCRIPT" input_file.txt

答案 3 :(得分:2)

cat mytest.pl | perl

......就是你所需要的。 -e开关期望脚本作为命令行参数。

答案 4 :(得分:1)

perl如果您没有给出任何论据,将从STDIN读取该程序。

因此理论上你可以读取加密文件,解密并运行它,而无需将文件保存在任何地方。


以下是一个示例程序:

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

use Crypt::CBC;

my $encrypted = do {
  open my $encrypted_file, '<', 'perl_program.encrypted';
  local $/ = undef;
  <$encrypted_file>;
};

my $key = pack("H16", "0123456789ABCDEF");
my $cipher = Crypt::CBC->new(
  '-key'    => $key,
  '-cipher' => 'Blowfish'
);
my $plaintext = $cipher->decrypt($encrypted);

use IPC::Run qw'run';
run [$^X], \$plaintext;

为了测试这个程序,我首先运行了这个:

perl -MCrypt::CBC -e'
  my $a = qq[print "Hello World\n"];
  my $key = pack("H16", "0123456789ABCDEF");
  my $cipher = Crypt::CBC->new(-key=>$key,-cipher=>"Blowfish");
  my $encrypted = $cipher->encrypt($a);
  print $encrypted;
' > perl_program.encrypted

这仍然不会阻止专门的黑客,但它会阻止大多数用户查看未加密的程序。