2011-09-22 158 views
0

我在做一個服務器管理器。我想添加一個「kill」命令,它會調用一個基本上運行shell_exec('kill $ arrtext')的php腳本;並終止進程,從而關閉服務器。下面是返回結果和檢查,以查看哪些服務器正在運行我的腳本的一部分:將變量傳遞給另一個PHP頁面

<?php 
$COMMAND = shell_exec('ps -o command ax | grep skulltag | grep -v grep'); 
$old = array("skulltag-server", "-port", "-iwad", "-wad", "+exec"); 
$new = array("SKULLTAG", "Running on Port", "Using IWAD", "+ PWAD", "with Config"); 
$COMMAND = str_replace($old, $new, $COMMAND); 
$arr = explode("./",$COMMAND); 
$text = shell_exec('pgrep -u doom'); 
$arrtext = preg_split('/\s+/', $text); 
for($i = 1; $i < count($arr); $i++) { 
    echo '<div class = "serverborder">'; 
    echo '<div class = "servertextalign">'; 
    echo $i,'. PROCESS ID <span style="color: #f00;">',$arrtext[$i],'</span> with server parameters: <span style="color: #777;">',$arr[$i],'</span>'; 
    echo '</div>'; 
    echo '</div>'; 
    echo '<br>'; 
} 
?> 

但是,我不知道我怎麼會添加一個鏈接或東西會設置正確的$ arrtext []變量(取決於他們選擇哪一個),並將其傳遞給會終止服務器的PHP腳本。

的現場演示可以在http://server.oblivionro.net/servers/

由於發現!

+1

哦,男孩,這是危險的東西 –

+0

這就像讓你的孩子玩交通 – horatio

+0

我知道這是危險的,這就是爲什麼我會有一噸檢查。其他提供商爲Ventrilo和其他遊戲服務器做類似的事情,他們是否使用相同的方法?他們做什麼不同? – Ivan

回答

1

您可以嘗試在另一個小腳本中使用shell_exec在命令行中運行該殺死腳本嗎?不要使用GET變量。我寧願爲列表中的每個服務器創建一個小表單,並通過POST傳遞它。需要微小的腳本,它隱藏的POST變量,發送表單動作相同的頁面,並通過該數組作爲參數

// In form 
echo '<input type="hidden" name="pid" value="'.$arrtext[$i].'"/>'; 

// In script 
$pid = $_POST['pid']; 
shell_exec('php -f /location/of/kill_script.php -- -'. $pid) 

其中PID是你的進程ID。顯然,你應該設置你的kill腳本來檢查該pid是否有效。這樣做的好處是,腳本的真實位置可以保持隱藏狀態,甚至不需要位於www根目錄中。您不應該直接鏈接真實腳本。

0

骯髒,骯髒的(不推薦)的方式來做到這一點是有鏈接到該腳本的命令,如:

<a href="killScript.php?p=<?php echo $arrtext[$i]; ?>">KILL</a> 

然後在killScript,你嚴格驗證過程中他們正在殺死他們應該殺死的東西。

更好的方法是避免使用和「kill」一樣強大的命令,這樣有人不會去killScript.php?p = 1230,其中1230是您的Minecraft遊戲的進程號或其他。

0

我很困惑,爲什麼你覺得有必要提問,因爲你似乎掌握了PHP腳本,並且已經用正確的數據創建了跨度等。構建錨標籤是微不足道的。錨標籤可能會引用GET變量,這可能是PID。經過適當的驗證,例如確保PID引用了Doom服務器進程(以及正確的登錄憑證),然後可以使用PID來釋放kill命令。

請注意,您可能會打開服務器,讓世界關閉服務器上的進程。

相關問題