繁体   English   中英

我可以从标准输入运行 Perl 脚本吗?

[英]Can I run a Perl script from stdin?

假设我有一个 Perl 脚本,即 mytest.pl。 我可以用cat mytest.pl | perl -e之类的东西运行它吗? cat mytest.pl | perl -e ?

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

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

perl < mytest.pl 

应该在任何外壳中都可以做到这一点。 它调用 perl 并通过 shell 重定向运算符<提供脚本。

不过,正如所指出的,这似乎有点不必要。 为什么不启动脚本

#!/usr/bin/perl

也许

#!/usr/bin/env perl

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

请注意无用使用 Cat 奖 每当我使用cat我都会停下来思考 shell 是否可以为我提供此功能。

有时需要执行一个 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
perl mytest.pl 

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

cat mytest.pl | perl

…是你所需要的全部。 -e开关将脚本作为命令行参数。

如果你不给它任何参数, 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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM