首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从屏幕读取输出

从屏幕读取输出
EN

Unix & Linux用户
提问于 2019-09-23 11:56:12
回答 1查看 801关注 0票数 0

我想使用NodeJs后端服务器构建一个Min克拉夫特with接口,它与Debian 9上的Bash脚本进行通信。

1:我使用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

我的Shell脚本:https://hastebin.com/acijegupud.bash

EN

回答 1

Unix & Linux用户

发布于 2019-09-24 15:19:29

我认为这在screen中是不可能的。您可以使用获取屏幕中命令输出的fifo,但我怀疑“我的外壳”是否会支持这一点。

然而,这与tmux是“可行的”。

进程状态/堆栈跟踪

堆栈跟踪

要使它正常工作,您必须检测您正在输入命令的程序在什么时候被困在相关的IO操作中。这样做的一种方法是运行堆栈跟踪并查找它。另见:如何判断命令是正在运行还是在等待用户输入?

这可能有点棘手,因为在需要的read之前,它可能会暂时停留在另一个上。它还可能需要一些猜测,根据它被卡住多长时间,以及在哪个文件描述符。它可以与下面的行计数方案相结合,以获得更高的准确性。

在测试时,我遇到了read(10, (zsh)和select(1, [0], NULL, NULL, NULL (python3 cli解释器)。可能没有其他的可能性,这就是为什么我没有将下面的脚本中的RegEx限制在这一点上。它现在只是在寻找一个括号。也许有人知道更精确的方法?

进程状态--一个很好的指示器可能是检查进程正在运行还是处于休眠状态。您可以使用ps来完成这个任务。此方法与堆栈跟踪相结合,用于下面的概念证明脚本中.

计数线

将服务器作为节点中的Child Process运行,可以使您与节点中进程的stdinstdout进行交互。您只需查找换行符(\n),如果您知道输出应该有多少行,您可以对它们进行计数,并“知道”它已完成运行,并再次等待输入。你可以把它和超时结合起来。

具有过程状态/Strace的概念的

证明我将脚本和一些篡改移到了一个github储存库中。我还没有在mc上测试过这一点,但它适用于python3zsh (就我所能测试的范围而言,请参阅“测试”一节)。它仍然不完美,因为它仍然涉及一些等待,可能或不可能得到假阳性。

如何使用

您可以这样启动服务器/tmux会话:

代码语言:javascript
复制
tmux new-session -d -s server_name "java -jar minecraft_server.jar"

向服务器发送命令如下所示:

代码语言:javascript
复制
./trun.sh -s server_name -c "the command"

它应该返回服务器的输出。您可能必须调整-H-T参数。

Synchronicity

请注意,如果您在are服务器上运行此操作,您可能会遇到问题,特别是如果有多个用户。您可能必须实现一个锁定,以防止多个用户同时访问shell。我确信tmux本身不会对此有任何问题,但如果在尝试读取所述输出时运行了另一个命令,则无法真正预测输出。

安全

如果您打算在向www公开的服务器上运行此服务,请考虑保护它(例如,通过apachenginx使用受密码保护的代理)。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/543206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档