簡體   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