2 votes

Exécution d'un programme perl entier à partir d'une chaîne de caractères en Perl

J'ai un programme crypté avec Blowfish dans un fichier et un second programme perl qui demande une phrase de passe utilisée pour le décrypter en une chaîne de caractères. J'aimerais ne jamais avoir à écrire la source décryptée sur le disque dur, bien que l'avoir en mémoire ne soit pas vraiment un problème puisque ceux qui exécutent le programme connaissent déjà la source. Je pensais utiliser eval mais le programme que je dois exécuter a beaucoup d'entrées/sorties en utilisant des Curses et d'autres choses, donc eval ne fonctionnera pas car il ne renvoie que la dernière valeur... Quelqu'un a-t-il une idée de la façon dont cela pourrait être réalisé ?

2voto

ephemient Points 87003

Vous pouvez utiliser un @INC pour effectuer le décryptage. Ensuite, vous pouvez simplement require o use le programme crypté. Par exemple,

# loader.pl
use Crypt::Rot13;
use File::Spec;
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 @INC, \&load_crypt;
}
require 'hello.pl';

# hello.pl.r13
cevag "Uryyb, jbeyq!\a";

$ **perl loader.pl**
Key?
**13**
Hello, world!

1voto

cjm Points 44090

Il n'y a aucune raison eval ne fonctionnera pas pour ce que vous décrivez. Bien qu'il ne renvoie qu'une seule valeur, cela n'empêche pas le code évalué d'interagir avec le terminal. Elle n'est généralement pas utilisée de cette façon, mais votre cas d'utilisation est une raison légitime pour utiliser la chaîne de caractères. eval . (Notez que vous pouvez toujours vous retrouver avec le code source écrit dans votre fichier swap).

0voto

RushPL Points 1979

Il suffit de lancer une instance distincte de perl et de lui passer le programme en utilisant l'entrée standard, comme ceci :

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

Avec du code perl :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X