在MUD游戏中执行外部指令或脚本(如python脚本)的方法

曾经有玩家提过一个需求,想在MUD游戏中调用操作系统的指令或脚本,如何实现?

其实实现起来很简单,因为驱动提供了一个efun external_start

不过这个外部函数在PACKAGE_EXTERNAL中,默认没有开启,需要在驱动编译时开启:

cmake -DPACKAGE_EXTERNAL=ON .. && make -j4 install

为了系统安全,驱动仅可调用在运行时配置文件中设置的指令,具体配置如下:

  external_cmd_1: /usr/bin/bash
  external_cmd_2: /usr/bin/python
  external_cmd_3: /usr/bin/curl
  # ... 最多可设置5条

注意最多可配置5个指令,但是通过脚本,其实你可以无限制的调用。

以上我们指定了3条命令,下面使用external_start函数来执行指令,语法如下:

int external_start(int, string | string *, string | function, string | function, string | function | void);

第一个参数指定了要调用的指令在运行时配置文件中的编号,第二个参数为传给指令的参数,后面三个参数为socket回调函数。

示例,我们新建一条指令bash.c,通过指令来调用系统脚本编译fluffos驱动,代码如下:

nosave object receiver;

mixed read_cb(int fd, string arg)
{
    tell_object(receiver, arg);
}

mixed write_cb(mixed *arg...)
{
    debug_message(sprintf("write_cb : %O", arg));
}

mixed close_cb(int fd)
{
    socket_close(fd);
}

int main(object me, string arg)
{
    receiver = me;
#if efun_defined(external_start)
    external_start(1, arg || "/root/fluffos/build.sh", "read_cb", "write_cb", "close_cb");
#else
    write("不支持 external_start\n");
#endif
    return 1;
}

这里我们在游戏中调用/root/fluffos/build.sh脚本,脚本示例如下:

#!/bin/bash

cd /root/fluffos/ && git pull
rm -rf build && mkdir build && cd build
cmake -DPACKAGE_EXTERNAL=ON .. && make -j4 install

当我们在游戏中运行指令bash时,就会自动执行脚本重新编译fluffos驱动,并显示编译信息给当前玩家。

file

京ICP备13031296号-4