2012-03-23 1 views
0

これは簡単な質問かもしれませんが、私はPHPをかなり新しくしており、これを理解するのは苦労しています。だから少しの背景 - 私のスクリプトは、リモートマシン上で簡単なコマンドを実行できるWebベースのアプリケーションから呼び出されます。たとえば、ユーザーはボタンをクリックしてリモートマシン上のログファイルにアクセスし、出力をユーザーに表示します。今、接続の問題があり、ターゲットサーバ上でsshが正しく設定されていない場合、これは永遠にハングアップする可能性があり、sshはタイムアウトしません。 phpやfastCGIのタイムアウトよりも優れたエラーを表示するために、スクリプトを強制終了し、タイムアウトが発生する前にユーザが実行していたコマンドを表示したい。簡単にするために、IIS/FastCGI/PHPのタイムアウトがすべて5分に設定されているとします。スクリプトが開始されたときにタイマーを設定したいと思っています.4分45秒が経過したら、スクリプトを終了し、実行しようとしていたコマンドを表示するエラーメッセージを表示してトラブルシューティングを行います手動で簡単な例のスタブ/擬似コードでn時間が経過した場合、PHPスクリプトでタイマーを設定し、エラーメッセージを出力し、スクリプトを強制終了するには?

:あなたはBunsen、「PHPのための高度なオブジェクト指向プログラムの実行ライブラリー」を使用することができ

function StartTimer(){ 

//start timer 

} 

function RunComand($cmd, $timer, $timeMax){ 

//runs user command through ssh library and streams back output. 
$output = sshLib($cmd); 

//this is where i want to do my check on the timer. If run through ssh lib takes too long 
//kill the script and return $cmd to display it to user. 

if ($timer > $timeMax){ 
    //kill script, output $cmd 
} 
return $output; 

} 

$cmd = $_GET['cmd'] //get users command 
$timer = startTimer(); 
$timeMax = 285; //285 seconds is 4 min 45 seconds 

$results = RunCommand($cmd, $timer, $timeMax); 

答えて

2

。ここで

は例です:

<?php 

require 'Bunsen.class.php'; 

// You should DEFINITELY sanatize the contents of `$_GET['cmd']` !!! 
$cmd = $_GET['cmd']; 
$timeMax = 285; 

$bunsen = new Bunsen; 
$bunsen->setTimeout($timeMax); 

$exitcode = $bunsen->exec($cmd); 

if ($exitcode === -1) { 
    trigger_error('Maximum time limit exceeded!', E_USER_ERROR); 
} 

あなたは、誰もがちょうど彼らのURLのクエリ文字列に入れることができると任意のコマンドを実行する方法について非常に注意しなければなりません。彼らは唯一のホワイトリストから知られている安全なコマンドを実行することができます

switch($_GET['cmd']) { 
case 1: 
    $cmd = 'first command'; 
    break; 
case 2: 
    $cmd = 'second command'; 
    break; 
case 3: 
    $cmd = 'third command'; 
    break; 
default: 
    trigger_error('Not allowed!', E_USER_ERROR); 
} 

その方法:あなたはこのような何かを持っていた場合、それは良いだろう。

+0

素晴らしい、これは完璧です。私は実際にクエリ文字列からcmdパラメータを受け入れていない、私は例としてそれを使用した。既知の安全なコマンドは、ユーザーが選択したオプションに基づいて設定テーブルに格納された値から動的に構築されます。安全なコマンドだけを実行することができます。私は、cmdをスクリプト経由でポスト経由で送信するか、直接コールしてcmdをパラメータとして渡します。しかし、警告と優れた例をありがとう!私はpcntl_fork()を使って簡単な解決策を書くことに始めましたが、これは時間を節約します。再度、感謝します。 – user797963

関連する問題