2011-09-22 116 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命令。

请注意,您可能会打开服务器,让世界关闭服务器上的进程。

相关问题