Могу ли я запустить скрипт 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 и передать ему аргумент. Конструкция 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
Это все равно не остановит выделенных хакеров, но это помешает большинству пользователей смотреть на незашифрованную программу.