Выполнение всей программы Perl из строки в Perl - PullRequest
2 голосов
/ 09 октября 2011

У меня есть программа, которая зашифрована с помощью Blowfish в файле, и вторая программа Perl, которая запрашивает парольную фразу, которая используется для расшифровки ее в строку, я бы не хотел записывать расшифрованный источник на жесткий дискникогда, хотя наличие его в памяти не является проблемой, так как те, кто работает с программой, уже знают источник.Я думал, что мог бы использовать eval, но программа, которую мне нужно запустить, имеет много ввода / вывода, используя Curses и прочее, поэтому eval не будет работать, так как он возвращает только последнее значение ... Кто-нибудь знает, как это можно сделать?

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

Вы можете использовать крюк @INC для расшифровки.Тогда вы можете просто require или use зашифрованную программу.Например,

# loader.pl
use <a href="http://search.cpan.org/perldoc?Crypt::Rot13" rel="nofollow">Crypt::Rot13</a>;
use <a href="http://perldoc.perl.org/File/Spec.html" rel="nofollow">File::Spec</a>;
sub decrypt_line {
    if ($_ ne '') {
        my ($self, $state) = @_;
        my ($crypt, $key) = @$state;
        $crypt->charge($_);
        ($_) = $crypt->rot13($key);
        return 1;
    }
}
sub load_crypt {
    my ($self, $filename) = @_;
    print "Key?\n";
    chomp(my $key = <STDIN>);
    for my $prefix (@INC) {
        open my $fh, '<', File::Spec->catfile($prefix, "$filename.r13") or next;
        return ($fh, \&decrypt_line, [Crypt::Rot13->new(), $key]);
    }
}
BEGIN {
    unshift <a href="http://perldoc.perl.org/perlvar.html#%40INC" rel="nofollow">@INC</a>, \&load_crypt;
}
<a href="http://perldoc.perl.org/functions/require.html" rel="nofollow">require</a> 'hello.pl';
# hello.pl.r13
cevag "Uryyb, jbeyq!\a";
$ <b>perl loader.pl</b>
Key?
<b>13</b>
Hello, world!
1 голос
/ 09 октября 2011

Нет причины eval не сработает для того, что вы описываете. Хотя он возвращает только одно значение, это не препятствует взаимодействию eval'd-кода с терминалом. Обычно он не используется таким образом, но ваш вариант использования является законной причиной для использования строки eval. (Обратите внимание, что вы все равно можете получить исходный код, записанный в файл подкачки.)

0 голосов
/ 09 октября 2011

Просто запустите отдельный экземпляр Perl и передайте ему программу, используя стандартный ввод, например:

echo 'print 2+2 . "\n";' | perl -

С кодом Perl:

open(P,"|perl -") || die "Failed: $!\n";                                                                                                                                                        
print P 'print 2+2 . "\n"'
...