Могу ли я запустить скрипт Perl из stdin?

Предположим, у меня есть скрипт Perl, а именно mytest.pl - ... Могу ли я запустить его чем-то вроде cat mytest.pl | perl -e?

причина, по которой я хочу это сделать, заключается в том, что у меня есть зашифрованный скрипт perl, и я могу расшифровать его в своей программе c, и я хочу запустить его в своей программе C. Я не хочу писать расшифрованный скрипт обратно на жесткий диск из-за проблем безопасности, поэтому мне нужно запустить этот Perl-скрипт на лету, все в памяти.

этот вопрос не имеет ничего общего с cat command, я просто хочу чтобы узнать, как передать Perl-скрипт в stdin и позволить Perl-интерпретатору запустить его.

5 ответов


perl < mytest.pl 

должны сделать трюк в любой оболочке. Он вызывает perl и подает скрипт через оператор перенаправления оболочки <.

как уже отмечалось, это кажется немного ненужным. Почему бы не запустить скрипт с

#!/usr/bin/perl

или, возможно,

#!/usr/bin/env perl

? (изменено, чтобы отразить ваш Perl и/или env путь)

Примечание бесполезное использование Cat Award. Всякий раз, когда я использую cat я останавливаюсь и думаю, может ли оболочка вместо этого предоставьте мне эту функциональность.


perl mytest.pl 

должно быть правильным способом. Почему ты делаешь ненужное?


иногда нужно выполнить скрипт perl и передать ему аргумент. Конструкция STDIN perl input_file.txt < script.pl не работает. Используя подсказку от как назначить значение heredoc переменной в 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

cat mytest.pl | perl

...все, что вам нужно. The -e switch ожидает сценарий в качестве аргумента командной строки.


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

Это все равно не остановит выделенных хакеров, но это помешает большинству пользователей смотреть на незашифрованную программу.