openwrt实现lua的cgi响应 lua中获取GET/POST数据

本文详细指导了如何在OpenWrt上安装uhttpd,配置Lua环境,编写并测试Fast-CGI Lua脚本,包括GET和POST数据处理。涉及步骤包括包管理、配置文件编辑、脚本编写及测试过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uhttpd + Fast-CGI的开发要求:

  1. 安装uhttpd包(https需要加装“uhttpd-mod-tls”和“px5g”);
  2. 修改uhttpd配置文件“/etc/config/uhttpd”,将Lua作为“interpreter”;
  3. Lua脚本写到“/www/cgi-bin/”目录下,但是不带扩展名,且可执行;
  4. Fast-CGI要求Lua脚本必须首先使用“io.write()”输出“Content-type: text/html\n\n”
  5. “/www/cgi-bin/”目录下的脚本可以调用“/usr/lib/lua/”目录下的自定义模块;
  6. Lua环境已经就绪。

“读取GET和POST数据”为例,全部使用默认值的情况下,如何具体实现:

第一步:使用“opkg update”更新“.ipk”包的源,然后使用“opkg install uhttpd”安装;

第二步:使用“vi /etc/config/uhttpd”,在“config uhttpd main”下添加一行

list interpreter '.lua=/usr/bin/lua'

第三步:建立目录“/www/cgi-bin”,并增加“+x”属性;

root@OpenWrt:~# mkdir -p /www/cgi-bin/
root@OpenWrt:~# chmod +x /www/cgi-bin/

建立响应文件,并增加“+x”属性;

root@OpenWrt:~# touch /www/cgi-bin/webservice
root@OpenWrt:~# chmod +x /www/cgi-bin/webservice

将文件“/www/cgi-bin/webservice”内容修改为:

#!/usr/bin/lua
local WebService = require 'WebService'
WebService.Run()

第四步:建立Lua模块文件(不再要求“+x”属性),并读取参数,返回响应:

root@OpenWrt:~# touch /usr/lib/lua/WebService.lua

将其内容修改为如下内容:

local WebService = {}

function WebService.Run()
    local client = os.getenv("REMOTE_ADDR")
    local GET = os.getenv("QUERY_STRING")
    local POST = nil
    local POSTLength = tonumber(os.getenv("CONTENT_LENGTH")) or 0
    if (POSTLength > 0) then
        POST = io.read(POSTLength)
        --POST = io.read("*a")
    end

    -- Fast-CGI+HTTP require HEADER
    -- enable cache
    --io.write("Content-type: text/html\n\n")
    -- disable cache, especially for Internet Explorer
    io.write("Content-type: text/html\nPragma: no-cache\n\n")

    local reply = string.format("Client %s said: url: [%s], data: [%s]\n", client or '-', GET or '-', POST or '-')
    io.write(reply)
end

return WebService

第五步:重启“uhttpd”服务(为了让更改的/etc/config/uhttpd生效):

root@OpenWrt:~# /etc/init.d/uhttpd restart

第六步:使用浏览器测试:

使用浏览器访问如下地址:

http://<openwrt_ipaddr>/cgi-bin/webservice?author=qige

这里假设OpenWrt开发板的IP为192.168.1.24:

http://192.168.1.1/cgi-bin/webservice?author=qige

最终效果如下图:

通过cUrl模拟POST提交

通过form表单POST提交的浏览器结果


注意:

  1. POST数据可以由curl、Python requests等进行模拟提交,也可以自制如:<form action="/cgi-bin/webservice" method="POST">提交;
  2. 根据Fast-CGI要求,必须要先使用“io.write()”输出http协议头部;再根据http协议的要求,头部和内容之间必须使用“\n\n”来隔开。因此Lua脚本必须先输出头部“Content-type: text/html\n\n”,再输出其它内容;
  3. 如果“不需要缓存”,输出立即过期,则修改头部内容为“Content-type: text/html\nPragma: no-cache\n\n”;
  4. 让uhttpd开机自动启动,需要执行“/etc/init.d/uhttpd enable”;
  5. 需要将接收到的数据输出到串口,可以再安装一个“coreutils-stty”包用于控制串口波特率
root@OpenWrt:~# opkg install coreutils
root@OpenWrt:~# opkg install coreutils-stty

再将以下内容添加到Lua模块的适当位置,并调用此函数即可:

function WebService.uartWrite(msg)
    local uartConfig = 'stty -F /dev/ttyS0 raw speed 9600\n'
    os.execute(uartConfig)

    local cmd = string.format("echo '%s' > /dev/ttyS0\n", msg or '')
    os.execute(cmd)
end
<think>好的,用户想了解OpenWRT中REST相关的实现或使用方法,特别是REST API的使用与实现。首先,我需要整理OpenWRT支持REST API的常见方法,可能包括现有软件包、自定义实现以及相关工具库。 首先,用户提供的引用中有提到libcurl在OpenWRT中的应用,引用[4]提到libcurl支持多种协议,包括HTTP和HTTPS,这可能用于发送REST请求。所以需要介绍如何安装和使用libcurl进行REST调用。 其次,引用[1]和[2]提到在WordPress中使用Disable REST API插件,这可能与OpenWRT本身无关,但可能用户对REST API的访问控制感兴趣,可能需要提到在OpenWRT中如何管理API的权限或安全措施,比如使用防火墙或身份验证。 引用[3]提到了使用REST API实现dynv6脚本,这可能涉及到在OpenWRT中通过脚本调用REST API来更新DNS记录,这可以作为应用案例来介绍。 接下来,需要确定OpenWRT是否有内置的REST API服务。已知OpenWRT默认使用ubus作为RPC机制,可以通过HTTP暴露为REST API,比如通过uhttpd-mod-ubus或rpcd插件。需要详细说明如何配置ubus和uhttpd来启用REST访问。 另外,用户可能想创建自己的REST API服务,可以用Lua或Shell脚本配合uhttpd来实现,或者使用Python的轻量框架如Flask。需要介绍安装相关软件包和编写示例代码。 还要考虑安全性,比如使用HTTPS、身份验证方法(如JWT、Basic Auth),以及防火墙设置,这些在引用[4]中提到的libcurl支持HTTPS证书授权可能相关。 最后,生成相关问题,覆盖安装步骤、安全措施、实际应用案例以及调试工具,帮助用户进一步探索。 需要确保回答结构清晰,分点说明不同的实现方法,每个部分给出具体步骤或示例,并引用相关的参考资料。同时,注意使用正确的中文术语和LaTeX格式,但用户的问题不涉及数学公式,可能不需要太多数学表达式,但根据系统指令,行内公式要用$...$,独立公式用$$...$$,但当前内容可能较少涉及,需要检查是否有必要使用。</think>### OpenWRT中REST API的实现与使用方法 #### 一、OpenWRT内置RPC机制(ubus) OpenWRT默认通过$ubus$框架提供进程间通信(IPC),可通过HTTP协议暴露为REST API。具体配置步骤如下: 1. **安装依赖包** ```bash opkg update opkg install rpcd uhttpd-mod-ubus ``` 2. **配置uhttpd** 在`/etc/config/uhttpd`中添加: ```nginx config uhttpd ubus list listen_http 0.0.0.0:8080 option rpc_uri /ubus option script_timeout 60 ``` 3. **调用示例** ```bash curl -X POST http://192.168.1.1:8080/ubus -d '{"jsonrpc":"2.0","id":1,"method":"call","params":["00000000000000000000000000000000","system","board",{}]}' ``` 返回设备硬件信息如CPU型号、内存状态[^4]。 #### 二、自定义REST API开发 ##### 方法1:使用Lua脚本(轻量级) 1. **安装uhttpd与Lua支持** ```bash opkg install uhttpd lua ``` 2. **创建API端点** 在`/www/cgi-bin/api`写入: ```lua #!/usr/bin/lua require("ubus") conn = ubus.connect() print("Content-type: application/json\n\n") print([[{"status":"active"}]]) ``` 3. 访问`http://192.168.1.1/cgi-bin/api`返回服务状态。 ##### 方法2:Python Flask框架(功能丰富) 1. **安装Python环境** ```bash opkg install python3-light python3-flask ``` 2. **编写服务脚本** ```python from flask import Flask app = Flask(__name__) @app.route('/api/network', methods=['GET']) def get_network(): return {"interfaces": ["br-lan", "eth0"]} if __name__ == '__main__': app.run(host='0.0.0.0', port=8080) ``` 3. 通过`http://192.168.1.1:8080/api/network`获取网络接口列表[^4]。 #### 三、第三方REST工具集成 1. **使用libcurl调用外部API** 安装库文件: ```bash opkg install libcurl ``` 示例脚本动态更新DNS记录(如dynv6): ```bash curl -X GET "https://dynv6.com/api/update?zone=example.com&token=YOUR_TOKEN&ipv4=auto" ``` 可结合cron实现定时更新[^3]。 2. **安全增强方案** - 通过`iptables`限制访问IP范围: ```bash iptables -A INPUT -p tcp --dport 8080 -s 192.168.1.0/24 -j ACCEPT ``` - 使用HTTPS加密通信(需配置SSL证书)。 #### 四、调试与监控 1. **实时日志查看** ```bash logread -f | grep uhttpd ``` 2. **API性能测试** 使用`curl`测量响应时间: ```bash curl -o /dev/null -s -w 'Time: %{time_total}s\n' http://localhost:8080/api ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值