我想使用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
发布于 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运行,可以使您与节点中进程的stdin和stdout进行交互。您只需查找换行符(\n),如果您知道输出应该有多少行,您可以对它们进行计数,并“知道”它已完成运行,并再次等待输入。你可以把它和超时结合起来。
具有过程状态/Strace的概念的
python3和zsh (就我所能测试的范围而言,请参阅“测试”一节)。它仍然不完美,因为它仍然涉及一些等待,可能或不可能得到假阳性。您可以这样启动服务器/tmux会话:
tmux new-session -d -s server_name "java -jar minecraft_server.jar"向服务器发送命令如下所示:
./trun.sh -s server_name -c "the command"它应该返回服务器的输出。您可能必须调整-H和-T参数。
请注意,如果您在are服务器上运行此操作,您可能会遇到问题,特别是如果有多个用户。您可能必须实现一个锁定,以防止多个用户同时访问shell。我确信tmux本身不会对此有任何问题,但如果在尝试读取所述输出时运行了另一个命令,则无法真正预测输出。
如果您打算在向www公开的服务器上运行此服务,请考虑保护它(例如,通过apache或nginx使用受密码保护的代理)。
https://unix.stackexchange.com/questions/543206
复制相似问题