如何在 Lua API 中执行 shell 脚本并获取输出

我是 luci 和 lua api 的新手。现在我在 opnewrt 中的 luci webgui 中删除防火墙规则遇到了问题。我知道用 uci 命令删除规则:uci delete firewall.@rule[index]

但是我不知道确切的索引。所以我使用下面的 shell 脚本 index.sh 来查找关键词的索引。

uci show firewall | grep $1 | grep -oE '\[.*?\]' | sed 's/[][]//g' | head -n 1

这里的 $1 是 MAC 地址。

我的流程是从 luci 中获取 MAC 地址,然后删除我之前设置的阻止该 MAC 地址访问网络的防火墙规则。为了让该 MAC 地址恢复网络访问权限。

但是我使用 luci.sys.execluci.util.exec 的 Lua API 来获取防火墙规则索引的输出都是错误的。

我的示例代码:

1.从 luci 中获取 MAC 地址

local del_mac = protocol.urldecode(luci.http.formvalue("deleteMac"))

2.执行 shell 脚本获取索引

local ruleindex = ut.trim(tostring(luci.sys.exec("index.sh '" .. del_mac .."'"))
local uci_delete_rule = "uci delete firewall.@rule['" .. ruleindex .. "]'"
luci.sys.exec(uci_delete_rule)

或者

local index = "index.sh %s" %{list_del_mac}
local rule_index = ut.trim(tostring(luci.util.exe(index)))
local uci_delete_rule = "uci delete firewall.@rule['" .. rule_index .. "]'"
luci.sys.exec(uci_delete_rule)

3.重新加载防火墙规则

luci.sys.exec("uci commit firewall")
luci.sys.exec("fw3 reload")

有人可以帮我解决这个问题吗? 感谢您的帮助。

点赞
用户3342050
用户3342050

这个对我来说看起来不太对: "index.sh %s" %{list_del_mac} 除非这是 Luci 中的 string.format,否则这不是合适的 Lua 语法。你可以将你的命令字符串连接起来,或者真正使用 string.format :

"index.sh " ..list_del_mac

或者

string.format( "index.sh %s", list_del_mac )

另外,为了在执行之后获得返回值,你需要将它发送到一个变量中:

return_value = luci.sys.exec(uci_delete_rule)
print( return_value )
2020-11-02 07:07:07