在本教程中,我们将向您展示如何为 ubus 创建一个可执行的 shell 脚本。我们还建议阅读 OpenWRT 关于此主题的 wiki,链接可在此处找到:OpenWRT Wiki。
此外,用户还应熟悉 JSON 格式,因为这是向 UBUS 服务传递信息的格式。有关 JSON 格式的简要概述,请参阅此链接。
UBUS Shell 脚本
ubus shell 脚本与普通 shell 脚本有两个显著区别,这些区别将在我们的示例中体现。
输入/输出
所有 ubus shell 脚本的输入/输出都采用 JSON 格式。这种格式确保了所有 ubus 服务之间的兼容性。JSON 也是在网络上传输数据的常用格式,因此请确保您熟悉其使用。典型的 JSON 对象/文件如下所示:'{"argument1":"value1", "argument2":"value2","argument3":"value3"}'
List 和 Call 函数
ubus shell 脚本还必须支持 list 和 call 函数,以便与 ubus 连接。从第一个 ubus 教程 中我们了解到,我们使用 ubus list 函数来展示如何使用服务,并使用 ubus call 来实际访问服务。这两种功能都在 shell 脚本中描述。
示例
在我们的示例中,我们将创建一个简单的 ubus 可执行 shell 脚本,用于计算两个整数的加法和减法,并以 JSON 格式返回结果。
首先,导航到 rpcd 目录:
cd /usr/libexec/rpcd
现在使用 cat 创建一个名为 Math 的文件:
cat > Math
然后粘贴以下代码:
#!/bin/sh . /usr/lib/onion/lib.sh # 包含解析 JSON 文件所需的功能 case "$1" in # list 函数描述如何使用 ubus 函数 list) echo '{ "addition": { "argument1": "value" , "argument2":"value"}, "subtraction": { "argument1": "value", "argument2":"value"} }' ;; # call 函数描述可用的方法 call) case "$2" in # 加法方法 addition) # 读取参数 read input # 将参数加载到 JSON 中以便检索 json_load "$input" # 使用下面的函数,将 "argument1" 的值存储在变量 val1 中 json_get_var val1 "argument1" json_get_var val2 "argument2" # 计算两数之和 ans=$(($val1+$val2)) # 使用 \ 来正确替换 echo "{ \"The ans is\" :\"$ans\"}" ;; subtraction) # 读取参数 read input # 将参数加载到 JSON 中 json_load "$input" # 使用下面的函数,将 "argument1" 的值存储在变量 val1 中 json_get_var val1 "argument1" json_get_var val2 "argument2" # 计算两数之差 ans=$(($val1-$val2)) # 使用 \ 来正确替换 echo "{ \"The ans is\" :\"$ans\"}" ;; esac ;; esac
粘贴代码后,按 CTRL+D 保存文件。
完成后,通过更改文件权限使文件可执行,输入以下命令:
chmod +x Math
之后,需要重启 rpcd 插件以识别我们刚添加的新服务。输入以下命令:
/etc/init.d/rpcd restart
这会将您的服务附加到 ubus。
现在检查服务是否已列出。运行以下命令检查服务是否可用:
ubus list
如您所见,Math 已列在我们的 ubus 服务中。如果没有,请尝试运行 /etc/init.d/rpcd stop
然后 /etc/init.d/rpcd start
,或重启您的 Omega。
现在尝试使用它,输入以下命令查看结果:
ubus list -v Math ubus call Math addition '{"argument1":"4","argument2":"6"}' ubus call Math subtraction '{"argument1":"4","argument2":"6"}'
至此,我们的 Ubus 迷你系列教程到此结束。
本文章由作者:佐须之男 整理编辑,原文地址: OpenWrt基于脚本实现ubus call script