我有一个程序在文件中用Blowfish加密,第二个perl程序提示用于将其解密为字符串的密码,我不想将解密的源写入硬盘虽然在内存中使用它并不是真正的问题,因为运行程序的人已经知道了源代码。我以为我可能会使用eval,但我需要运行的程序有很多输入/输出使用Curses和东西所以eval不会工作,因为它只返回最后一个值...有没有人知道如何实现这一点? / p>
答案 0 :(得分:2)
您可以使用@INC
挂钩执行解密。然后,您只需require
或use
加密程序即可。例如,
# 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!
答案 1 :(得分:1)
没有理由eval
不能用于你描述的内容。虽然它只返回一个值,但这并不妨碍eval'd代码与终端进行交互。它通常不是那样使用的,但是你的用例是使用字符串eval
的合理原因。 (请注意,您仍然可以将源代码写入交换文件。)
答案 2 :(得分:0)
只需启动一个单独的perl实例,然后使用标准输入将程序传递给它,如下所示:
echo 'print 2+2 . "\n";' | perl -
使用perl代码:
open(P,"|perl -") || die "Failed: $!\n";
print P 'print 2+2 . "\n"'