【问题标题】:Live console input/output for a gameserver using JavaScript or PHP使用 JavaScript 或 PHP 的游戏服务器的实时控制台输入/输出
【发布时间】:2020-02-17 11:17:26
【问题描述】:

一般信息:我在地下室为一些朋友运行了一个 Minecraft 服务器,现在已经运行了几个月。我们使用 TeamViewer 将命令输入控制台,并在服务器运行时查看可能出现的错误。 Minecraft 服务器的控制台基本上会向您显示带有时间戳的事件日志以及底部的命令输入行,使您能够以管理员权限执行游戏中的命令。

控制台通过批处理文件启动:

:startup
@echo off
set v1=6
cls
Java -Xmx%v1%G -jar spigot.jar nogui
goto startup

spigot.jar 文件是基本上运行服务器的文件。

因为我们管理多个服务器并且 TeamViewer 进程非常不安全且速度很慢,所以我想找到其他方法来访问控制台。

目标:我想创建一个使用 JavaScript 或 PHP 与服务器控制台通信的 HTML 网络界面。它应该能够显示实时控制台日志以及能够在浏览器中键入命令,然后在服务器上的命令行中执行。

问题:

  • 有什么方法可以将 JavaScript/PHP 输入发送到控制台,以便我可以从 Web 界面执行命令?

  • 我可以将实时控制台输出保存到 .txt 文件中,然后 JavaScript/PHP 脚本可以在 Web 界面上实时显示吗?

【问题讨论】:

  • 快速谷歌搜索揭示了这方面的一些尝试。 mcmyadmin.com 还有各种开源选项。你调查过这个吗?将节省重新发明轮子

标签: javascript php html cmd minecraft


【解决方案1】:

我想你可以在这样的网站上显示日志:

第一个游戏服务器脚本:

:startup
@echo off
set v1=6
cls
Java -Xmx%v1%G -jar spigot.jar nogui > log.txt
fileup log.txt
goto startup

第二个游戏服务器脚本(称为 fileup.bat){如果您的 php 服务器,请将 myusername、mypassword 和 servername.com 替换为凭据}:

@echo off
echo user MyUserName> ftpcmd.dat
echo MyPassword>> ftpcmd.dat
echo bin>> ftpcmd.dat
echo put %1>> ftpcmd.dat
echo quit>> ftpcmd.dat
ftp -n -s:ftpcmd.dat SERVERNAME.COM
del ftpcmd.dat

php-server 端脚本:

<?php
$filename = "log.txt";
$fp = fopen($filename, "r");

$content = fread($fp, filesize($filename));
$lines = explode("\n", $content);
fclose($fp);
print_r($lines);
?>

顺便说一句:我没有测试过这些脚本中的任何一个,它们可能不起作用,我只是基于我对 php 和批处理的了解。此外,第二个批处理脚本需要与第一个批处理脚本位于同一目录中,您不必运行第二个批处理脚本

注意: 我是一位经验丰富的 PHP 用户,但我不太了解批处理(我使用 linux),但我想这会起作用,而且我过去经常使用批处理。此外,我建议在 000webhost.com 或 infinityfree.net 的外部托管 php 服务器上使用 PHP 脚本,因为它们是免费的,可以为您节省大量时间 + 他们预先配置了所有需要的 ftp 东西。

如果这有效,请告诉我

【讨论】:

    【解决方案2】:

    我绝对建议将您的设置移到 Windows 环境之外,因为您可以更轻松地在 Linux 环境中托管 PHP 服务器等。

    诚然,我对 MineCraft 并不熟悉,但看起来您拥有的批处理文件实际上只是启动了一个 Java JAR,它可以从任何安装了 JRE 的计算机上完成。 Java 控制台应用程序读取进程的 STDIN 上的输入并在 STDOUT 上输出任何应用程序生成的输出。这在 Ubuntu 环境中非常容易上手。

    例如,假设您在全新安装的 Ubuntu 上安装了标准 LAMP 堆栈。您将拥有用于运行服务器端进程的 PHP,以及用于托管您决定构建的任何 Web 界面的 Apache。关注前端与后端,我可能会尝试使用 Slim 或其他轻量级框架在 PHP 中设置 API。在用于启动服务器的 API 端点中,它看起来像这样:

    exex('screen -d -m -S ServerOne');    
    exec('screen -S ServerOne -p 0 -X stuff "java -Xmx%v1%G -jar spigot.jar nogui > /some_path_to_log^M"');
    

    第一个exec() 将创建一个名为“ServerOne”的屏幕会话,您的服务器进程可以在其中运行。第二个exec() 将发送在屏幕会话中启动服务器进程所需的命令。实际上,这将使您的服务器异步运行到您的 PHP 脚本,并将输出写入指定的路径。知道在哪里可以期待输出,在用于获取日志的 API 端点中,您将拥有类似的内容:

    $logContent = file_get_content('/some_path_to_log'); 
    

    最后,在您用于向服务器写入命令的 API 端点中,您将拥有如下所示的内容:

    exec('screen -S ServerOne -p 0 -X stuff "<your_command_here>^M"');
    

    这将写入您服务器的 Java 进程的 STDIN 流,这反过来应该被解释为您实际上是在控制台本身的键盘上打字。

    这就是它的基本原理,或者至少是我开始的地方。您可以使用 WebSockets 做一些非常酷的事情来为您的服务器控制台打开一个实时 I/O 会话,但它会比这篇文章更复杂一些。如果您有兴趣,请查看Ratchet 的 PHP 或 ws 的 Node.js。

    请考虑this ServerFault post,了解有关将输入发送到屏幕会话的更多信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-22
      相关资源
      最近更新 更多