我正在制作服务器管理员。我想添加一个“kill”命令,它会调用一个基本上运行shell_exec的php脚本('kill $ arrtext');并终止进程,从而关闭服务器。以下是我的脚本中返回结果并检查哪些服务器正在运行的部分:
<?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/
找到谢谢!
答案 0 :(得分:1)
你能尝试在另一个很小的脚本中使用shell_exec来在命令行中运行kill脚本吗?不要使用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根目录中。您不需要直接链接真实脚本。
答案 1 :(得分:0)
脏,脏(不推荐)的方法是使用命令将链接转到脚本,如:
<a href="killScript.php?p=<?php echo $arrtext[$i]; ?>">KILL</a>
然后在killScript中,你严格地验证他们正在杀死他们应该杀死的东西的过程。
更好的方法是避免使用像“kill”这样强大的命令,这样有人就不会去killScript.php?p = 1230其中1230是你的Minecraft游戏的进程号或其他东西......
答案 2 :(得分:0)
我很困惑为什么你觉得有必要问,因为你似乎已经掌握了PHP脚本并且已经使用正确的数据创建了跨度等。构建锚标记是微不足道的。 anchor标记可能引用GET变量,该变量可能是PID。经过适当的验证,例如确保PID引用了一个doom服务器进程(以及正确的登录凭据),然后可以使用PID来终止kill命令。
请注意,您可能会打开服务器以允许全世界关闭服务器上的进程。