[英]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.