アップデート2:私はこれを機能させてライブです:)
更新:コメントを確認してください。@ ikegamiの回答は機能していますが、少し問題があります。私はかなり単純な間違ったことをしているのかもしれません。
私は最近、Linux / Perlを本当によく学ぶ必要があると判断し、学習プロジェクトとしてこのwww.tryperl.comの構築を開始しました。これは一種のクラウドIDEです。
(私が最初にperl、linux、bash、osxを手にしたのはほんの数ヶ月ですので、気楽にやってください)
現在、 Safe.pmでコードを評価していますが、私のゲームプランは次のとおりです。
安全でないperlコードを評価し、結果を返す別のAmazonEC2VM。VMはインターネットからブロックされ、負荷分散されます。その後、時々スナップショットからこのマシンをリセットできます。
これは主にサーバー上の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でパイプすることはできますか?のように。これはコメントの@ikegamiによって解決されました。open(FILE,"perl <some_magic> | ")
。ばかげているように聞こえるかもしれませんが、私は尋ねなければなりませんでした:(Capture::Tinyを使用できないようです。タイムアウトブロック内でこれを実行しようとしました:
my ($stdout, $stderr, $count) = capture { system('echo Hello') };
しかし、空の文字列を取得し続けました!:(タイムアウト内にあるからですか?(これについてはあまり気にしませんが)私が見ていない他のセキュリティ上の欠陥はありますか?フォーク制限を行う必要がありますか?どうすればそれを始めればよいですか?(リンクといくつかのポインタがいいでしょう)
http://www.perltuts.comの作成者は、この記事で、qemuとdebianイメージを使用してコードを実行していると述べています。フォークの制限は別として、彼のアプローチは意味的に私のものと似ていますか?(ここで再び私の無知を許してください、私がほんの数ヶ月前にLinuxボックスに触れたことを思い出してください)
私の開発ボックスはOSX10.8で、本番サーバーはフロントエンド用のRHEL、Perlevalマシン用のUbuntuです。EC2で実行します。スタックの詳細については、こちらをご覧ください。
詳細な回答は、担当者とユニコーンダストで高く評価され、報われます:)