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