我想使用 NodeJs 后端服务器构建 Minecraft Web 界面,该服务器与 Debian 9 上的 Bash Shell 脚本进行通信。
1:我使用以下命令创建一个新的 Minecraft 服务器screen -S server_name java -jar minecraft_server.jar
2:NodeJs 后端向我的 Shell 文件发送一个命令,效果很好:例如screen -rd server_name -X stuff "whitelist add $3^M"
3:服务器屏幕上将显示一个包含玩家列表的字符串。
但我的问题是,如何读取这个输出字符串并让 NodeJs 后端读取它?
我的 NodeJs 后端:https://hastebin.com/adosiwiqiq.coffeescript
答案1
我认为这在screen
.您可以使用fifo 在屏幕上获取命令的输出,但我怀疑“minecraft shell”是否会支持这一点。
然而,这是“可行的” tmux
。
进程状态/堆栈跟踪
堆栈跟踪
为了使其正常工作,您必须检测您正在提供命令的程序在哪个点卡在相关的 IO 操作上。一种方法是运行堆栈跟踪并寻找它。另请参阅:如何判断命令是否正在运行或正在等待用户输入?。
这可能有点棘手,因为它可能会在read
所需的之前暂时卡在另一个位置。它还可能需要根据卡住的时间和文件描述符进行一些猜测。它可以与下面的行计数建议结合起来以获得更高的准确性。
编辑
在测试这个时,我遇到了read(10,
(zsh
)和select(1, [0], NULL, NULL, NULL
(python3
cli 解释器)。可能还有很少的其他可能性,这就是为什么我没有将RegEx
下面的脚本中的限制仅限于此。它现在只是在寻找一个左括号。
也许有人知道更精确的方法来做到这一点?
进程状态
一个好的指标可能是检查进程是否正在运行或睡眠。您可以使用 来执行此操作ps
。此方法与堆栈跟踪结合用在下面的概念验证脚本中。
计数线
让服务器作为Child Process
Node 中的进程运行使您能够与stdin
Nodestdout
中的进程进行交互。您可以只查找换行符 ( \n
),如果您知道输出应该有多少行,您可以对它们进行计数并“知道”它已完成运行并正在再次等待输入。您可以将其与超时结合起来。
使用进程状态/Strace 进行概念验证
我将脚本和一些文档移至github 存储库。我还没有使用 mc 对此进行测试,但它可以与python3
and一起使用zsh
(据我可以测试它,请参阅“测试”部分)。它仍然不完美,因为它仍然需要一些等待,并且可能会也可能不会得到误报。
如何使用
tmux
您可以像这样启动服务器/会话:
tmux new-session -d -s server_name "java -jar minecraft_server.jar"
向服务器发送命令如下所示:
./trun.sh -s server_name -c "the command"
它应该返回服务器的输出。您可能需要调整-H
和-T
参数。
同步性
请注意,如果您在网络服务器上运行此程序,则可能会遇到问题,尤其是在有多个用户的情况下。您可能必须实施锁防止多个用户同时访问 shell。我确信它tmux
本身不会有问题,但是如果在您尝试读取所述输出时可能运行了另一个命令,您就无法真正预测输出。
安全
如果您打算在暴露于 www 的服务器上运行此程序,请考虑保护它(例如通过apache
或使用受密码保护的代理nginx
)。