如何从宿主机向Docker中运行的Minecraft服务器执行命令?
在Docker部署的Minecraft服务器中执行宿主机命令的正确方式
问题分析
你执行的docker-compose exec spigot echo "help" > /dev/pts/0只是将字符串写入终端设备,但Minecraft服务器的Java进程需要带换行符的完整输入才会触发命令执行,且直接写入终端设备并非向进程标准输入发送数据的正确方式,因此命令不会被执行。
解决方案
方法一:通过管道向进程标准输入发送带换行的命令
利用docker-compose exec的标准输入传递功能,发送包含换行符的命令:
echo -e "help\n" | docker-compose exec -T spigot sh -c 'cat > /proc/$(pgrep -f spigot-1.8.8.jar)/fd/0'
-T参数禁用伪终端,避免交互干扰pgrep -f spigot-1.8.8.jar定位Minecraft服务器进程ID/proc/<PID>/fd/0是进程的标准输入文件描述符,写入此处相当于向进程输入命令
更简化的写法(依赖容器内Java进程的stdin已正确关联):
echo -e "help\n" | docker-compose exec -T spigot cat >&0
方法二:使用RCON协议(推荐,稳定可靠)
Minecraft原生支持RCON远程命令协议,这是批量/自动化执行命令的最佳方式:
- 修改容器内
server/server.properties配置文件:enable-rcon=true rcon.port=25575 rcon.password=your-secure-password - 在
docker-compose.yaml中添加RCON端口映射(可选,方便宿主机直接访问):ports: - "25565:25565" - "25575:25575" - 重启容器后,使用
mcrcon(轻量RCON客户端)执行命令:
若未安装mcrcon -H localhost -P 25575 -p your-secure-password "help"mcrcon,可通过包管理器(如apt install mcrcon或brew install mcrcon)安装。
方法三:用Expect脚本模拟交互
编写Expect脚本模拟手动输入命令的过程:
- 创建
send_mc_cmd.exp脚本:#!/usr/bin/expect spawn docker-compose exec spigot sh send "help\r" expect eof - 赋予执行权限并运行:
chmod +x send_mc_cmd.exp ./send_mc_cmd.exp
内容的提问来源于stack exchange,提问作者Chaosdave34
相关产品推荐
相关产品推荐

