假设我有一个Perl脚本,即mytest.pl。我可以通过像cat mytest.pl | perl -e
这样的东西来运行它吗?
我想这样做的原因是我有一个加密的perl脚本,我可以在我的c程序中解密它,我想在我的c程序中运行它。由于存在安全问题,我不想将解密的脚本写回硬盘,所以我需要在内存中运行这个perl脚本。
这个问题与cat
命令无关,我只是想知道如何将perl脚本提供给stdin,并让perl解释器运行它。
答案 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
这仍然不会阻止专门的黑客,但它会阻止大多数用户查看未加密的程序。