更新2:我得到了这个工作并且它是活的:)
更新:请检查评论,@ikegami 的答案是有效的,但有一个小问题。我可能做错了一些非常简单的事情。
我最近决定我必须非常好地学习 Linux/Perl,然后我开始构建这个www.tryperl.com作为一个学习项目。它是一种云 IDE。
(从我第一次接触 perl、linux、bash、osx 到现在才几个月,所以请放轻松)
目前我使用Safe.pm评估代码,但我的游戏计划是:
一个单独的 Amazon EC2 虚拟机,它将评估不安全的 perl 代码并返回结果。VM 将被阻止访问 Internet 并进行负载平衡。然后我可以不时地从快照中重置这台机器。
这主要是我将用于在服务器上评估 perl 代码的代码,我使用Time::Out进行超时管理:
my $code = ..
my $arg = ..
#create a file with random name
my $filename = rand().".pl";
open(FILE,">$filename")
print FILE $code;
close(FILE);
#use Time::Out to timeout after 10 secs
my $ret = timeout 10 => sub {
#run the file just created with $arg as an argument. << This is IMP
my $r = `perl $filename $arg`;
return $r;
};
if ($@){
return $@;
}
return $ret;
我的问题
我可以以某种方式避免创建物理文件并使用 $arg管道 $code吗?喜欢:( 。@ikegami 在评论中解决了这个问题。open(FILE,"perl <some_magic> | ")
。听起来可能很愚蠢,但我不得不问我似乎无法使用Capture::Tiny。我尝试在超时块内执行此操作:
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
但我一直收到空字符串!:(是因为它在超时内吗?(不过我不太关心这个)还有其他我没有发现的安全漏洞吗?我应该做一个分叉限制吗?我应该如何开始这样做?(链接和一些指针会很好)
http://www.perltuts.com的作者在这篇文章中说他使用 qemu 和一个 debian 映像来运行他的代码。除了分叉限制之外,他的方法在语义上是否与我的相似?(再次原谅我的无知,记得几个月前我才接触过一个linux盒子)
我的开发箱是 OSX 10.8,生产服务器是 RHEL 用于前端,Ubuntu 用于 Perl 评估机器。我在 EC2 上运行。在此处查看完整的堆栈详细信息。
任何详细的答案将不胜感激,并以代表和独角兽尘埃奖励:)