2011-10-08 56 views
2

我有一個程序在文件中用Blowfish加密,第二個perl程序提示用於解密成字符串的密碼,我不想把解密後的源文件寫入硬盤驅動器,儘管將它解密到內存中並不是一個真正的問題,因爲運行該程序的用戶已經知道了源碼。我想我可能會使用eval,但我需要運行的程序有很多輸入/輸出使用Curses和東西,所以eval不會工作,因爲它只返回最後一個值...有沒有人有任何想法如何能夠完成?從Perl中的字符串執行整個perl程序

回答

2

您可以使用@INC鉤子執行解密。那麼你可以簡單地使用requireuse這個加密程序。例如,

# 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! 
+0

Heeey,所以這是令人敬畏的!和我所需要的,這是一個完全不相關的問題,我用它來創建我的密碼對象 'my $ cipher = Crypt :: CBC-> new(-key => $ key,-cipher =>'Blowfish') ;' 但是這條線似乎打破了循環,並沒有得到任何進一步移動到下一個對象。我似乎無法弄清楚哪裏有一個地方讓我找到錯誤等......最近怎麼樣 – rolands

0

剛開始一個單獨的Perl實例,並使用標準輸入程序傳遞給它,就像這樣:

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

用Perl代碼:

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

SOOOO我做的第一件事就是試試這個,可惜一些事情似乎完全凍結了我的終端,就像我無法輸入任何東西,沒有控制字符工作等,只修復方法是打開另一個終端並殺死解釋器.... sooooo。另外,當我試圖評估整個程序的字符串時,在終端中沒有任何事情發生,程序運行並結束,我沒有出現任何輸出等。 – rolands

1

沒有理由eval不會爲工作你描述的是什麼。雖然它只返回一個值,但並不妨礙已評估的代碼與終端進行交互。它通常不會以這種方式使用,但您的使用案例是使用字符串eval的合法理由。 (請注意,您仍然可能會將源代碼寫入交換文件。)