搭建MC服务器时,我们有多种选择,其中淘宝的面板服租赁业务提供了便捷的搭建方式。可是面板服的自由度极其低下,最多只允许你跑一个基本的Paper或整合包端。
在“突破面板服的桎梏”系列中,我们将探讨如何一步步突破面板服的限制,搭建一个全功能的服务器。本系列难度逐步递增,适合不同水平的服主。
本篇文章为第二期,需要你了解HTTP与Websocket通信,并熟悉使用浏览器F12抓包。
本文给出了一种在面板服使用Linux命令行的方法,解决当Velocity重启时,所有的子服务器也会跟着重启的问题。
推荐阅读:
上一篇文章中,我们探讨了Impulse服务端管理器的基本使用方法,使用其成功搭建了一个多世界的Minecraft服务器,但这个插件尚有一些不足函待解决。如果我们可以直接访问Shell,那么一切困难就都能解决了。
在面板服自带的文件管理中,我们可以发现当前用户的家目录是/home/container
,这提示我们的服务器跑在一个Linux容器1中。一个容器可以极端轻量化,但至少也得有个Bash(或者Sh)可供使用。
问题是,所有的shell都是native2的二进制文件,而面板服的启动按钮只能以java -jar xxx.jar
的形式运行程序,因此一个交互式的shell无法直接启动。
ExecuteHostCommand是一个Velocity插件,可以通过MC命令调用shell命令,从而达到访问Bash的目的。
然而实战中,这个插件不太好用……它在处理字符串时的策略不太对,想通过bash -c
执行指令极其困难。而这个插件又不支持输入stdin,因此交互式终端也没辙。
这个方法似乎走不通……
市面上各种服务端很多,什么Paper啊Fabric啊Velocity啊,一个共同的特点是都是可以通过java -jar xxx.jar
的形式启动的。那我自己编一个端,直接在里面调用Bash不就好了?
隆重介绍——BashJar端!这是我个人自编的服务端,以Apache 2.0协议开源,代码寥寥数行:
1 | import java.io.IOException; |
如果不会Java也不用担心,Releases中可以直接下载.jar
文件,当作一个MC服务端运行就可以了~
这个端在网页控制台与Bash之间建立了桥梁,现在我们终于可以在网页控制台用Bash了!
可以看到,ls -Ahl /
、df -h
与uname -a
等命令正常运行。
这什么情况?
开F12,发现网页控制台是通过Websocket进行通信的,而我们的cd
命令并没有被发送到后端,也就是说这个限制是在前端进行的。
在F12中翻代码,发现:
1 | for (let i in [ |
含cd
、wget
、curl
等常用关键命令的语句被禁止,其他语句则通过Websocket发送。
假如这个限制是纯前端的,我们只需要重新实现一遍这个前端,就可以绕过这个纯前端的限制了。
另一种做法是通过油猴脚本等方法禁用这里的限制,但我对油猴脚本不太熟悉,pass。
替换必要的内容,并用Python运行:
1 | > python main.py |
很好,现在我们终于有全功能的Bash用了!
警告
我们没法通过这个客户端发送Ctrl+C、Ctrl+D这样的命令,因此不要进入那些只能通过Ctrl+C退出的程序!假如一不小心吃了这样的赛博灯泡,就只能在控制面板强制关服了。
最简单的方法,就是命令行结尾加个&:
1 | java -Xmx4G -jar server.jar & |
我们的BashJar不会关闭(除非手动输入exit
或者在控制面板强制关服),因此使用&将进程放到后台运行是绝对可行的,完美解决了“当Velocity重启时,所有的子服务器也会跟着重启”的问题。
这是最简单的办法,没有守护程序。假如意外崩端了,我们就得手动再启动服务器。
也可以看看Wiki上介绍的这些服务器启动脚本。没用过,不知道好不好用。
再次警告
某些启动脚本可能只依赖Ctrl+C退出,不能使用这种脚本。
本文通过一系列手段解决了上一篇文章中提到的第一个问题,但仍有两个问题尚未解决:
这两个更复杂的问题,就留到下一期再说吧~
我的面板服限制很严苛,但如果你的面板服限制比我的还要严苛,就可能遭遇下面三种情况:
一般的服务器都是Ubuntu镜像,但假如是Alpine,一般就只有sh可用了。欢迎留言,我可以帮助构建一个sh版本的BashJar。
市面上的面板服技术栈都差不多,但如果真有面板服做了黑科技阻止你这么做,我们就需要将这些限制通过别名绕过。
这是一篇介绍别名的教程。将别名添加到/home/xxx/.bashrc
中即可生效。
.bashrc
的内容会在Bash启动时自动执行。
/home/xxx/.bashrc
真是不可思议……但是有解!欢迎留言,我可以帮助构建不使用.bashrc
也可使用别名的BashJar。