3Openwrt自定义CGI实现 前后端交互
https://www.cnblogs.com/163yun/p/9834993.html
安装uhttpd。
在编译openwrt前,输入make memuconfig,查找Network -> Web Servers/Proxies -> uhttpd,如果没勾选则勾选。然后编译固件。
修改uhttpd配置。
安装运行openwrt后,通过ssh登陆,修改/etc/config/uhttpd配置文件,在文件末尾添加新的web服务。添加数据基本格式如下:
config 'uhttpd' 'ServerName' option 'home' '/root/' list 'listen_http' '0.0.0.0:8080' option 'cgi_prefix' '/cgi-bin'
其中:
名称 | 说明 |
uhttpd | 服务名称,不要和系统的重名即可 |
home | 服务的根目录 |
listen_http | CGI前缀,用来区分是否调用的CGI |
cgi_prefix | CGI前缀,用来区分是否调用的CGI |
还有其他配置,不一一列举,比如index_page 、error_page 、listen_https、cert、key、script_timeout、network_timeout、tcp_keepalive等。
修改后需要重启uhttpd,使用命令:
/etc/init.d/uhttpd restart
配置静态页面。
在服务的根目录下配置web页面,比如index.html(如果uhttpd配置未指定,则为默认页面)。如下是一个网上找到的登陆网页:
<html>
<head><title>..................</title></head>
<body>
<form name="form1" action="/cgi-bin/helloworld">
<table align="center">
<tr><td align="center" colspan="2"></td></tr>
<tr>
<td align="right">.........</td>
<td><input type="text" name="Username"></td>
</tr>
<tr>
<td align="right">... ...</td>
<td><input type="password" name="Password"></td>
</tr>
<tr>
<td><input type="submit" value="... ..."></td>
<td><input type="reset" value="... ..."></td>
</tr>
</table>
</form>
</body>
</html>
当用户点击登陆时,会跳转访问当前目录下的/cgi-bin/helloworld。
编写CGI程序。
例如上一步的/cgi-bin/helloworld即为web服务的CGI程序。本文介绍通过ipk的方式安装CGI程序的方法。
生成ipk需要借助openwrt的交叉编译,首先在openwrt目录下的package目录下建立一个目录,本例为:helloworld。然后在helloworld目录下建立Makefile文件和src目录。其中Makefile文件的内如如下:
include (TOPDIR)/rules.mkPKGNAME:=helloworldPKGRELEASE:=1PKGBUILDDIR:=(BUILD_DIR)/(PKGNAME)include(INCLUDE_DIR)/package.mk
define Package/helloworld SECTION:=utils CATEGORY:=Utilities TITLE:=Helloworld – prints a snarky message
endef
define Package/helloworld/description If you can't figure out what this program does, you're probablybrain-dead and need immediate medical attention.
endef
define Build/Prepare mkdir -p (PKGBUILDDIR)(CP) ./src/* $(PKG_BUILD_DIR)/
endef
define Package/helloworld/install (INSTALLDIR)(1)/root/cgi-bin/ $(INSTALL_BIN) (PKGBUILDDIR)/helloworld(1)/root/cgi-bin/
endef
(eval(call BuildPackage,helloworld))
其中制定安装路径为web服务的CGI路径。
src目录下放入自己的程序及Makefile,本例中有:
helloworld.c内容如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h> void list_argument(void)
{ char *env_var[] = { "COMSPEC", "DOCUMENT_ROOT", "GATEWAY_INTERFACE", "HTTP_ACCEPT", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_CONNECTION", "HTTP_HOST", "HTTP_USER_AGENT", "PATH", "QUERY_STRING", "REMOTE_ADDR", "REMOTE_PORT", "REQUEST_METHOD", "REQUEST_URI", "SCRIPT_FILENAME", "SCRIPT_NAME", "SERVER_ADDR", "SERVER_ADMIN", "SERVER_NAME","SERVER_PORT","SERVER_PROTOCOL", "SERVER_SIGNATURE","SERVER_SOFTWARE", "CONTENT_LENGTH" }; char *value, i; for (i=0; i<25; i++) { value = getenv(env_var[i]); if (value) { printf("<p>"); printf ( "%s = %s \n", env_var[i], value); printf("<\p>"); } }
}
int main(){
printf("Content-Type:text/html;charset=utf-8\n\n");
printf("<html>\n");
printf("<head>\n<title>test</title>\n</head>\n");
printf("<body>\n");
printf("<p>");
printf("hello~\n");
printf("</p>");
list_argument();
printf("</body>\n");
printf("</html>\n");
}
Makefile内容如下:
helloworld: helloworld.o (CC)(LDFLAGS) helloworld.o -o helloworld
helloworld.o: helloworld.c (CC)(CFLAGS) -c helloworld.c
clean: rm *.o helloworldo
使用openwrt编译好后,把ipa通过scp上传到路由器下(或直接编译到固件中),安装:
opkg install helloworld_1_x86.ipk
之后就会在/root/cgi-bin下看见helloworld程序。调用程序能正常输出网页:
root@OpenWrt:~/cgi-bin# ./helloworld
Content-Type:text/html;charset=utf-8
<html>
<head>
<title>test</title>
</head>
<body>
<P>hello</p></body>
</html>
结果输出
浏览器就会打开默认页面(192.168.8.106是测试路由器地址),点击默认页面的确定按钮,就会返回CGI的输出,如下图:
hello~
DOCUMENT_ROOT = /root
GATEWAY_INTERFACE = CGI/1.1
HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
HTTP_ACCEPT_ENCODING = gzip, deflate
HTTP_ACCEPT_LANGUAGE = zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
HTTP_CONNECTION = keep-alive
HTTP_HOST = 192.168.8.106:8080
HTTP_USER_AGENT = Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:29.0) Gecko/20100101 Firefox/29.0
PATH = /sbin:/usr/sbin:/bin:/usr/bin
QUERY_STRING = Username=11&Password=222
REMOTE_ADDR = 192.168.8.103
REMOTE_PORT = 53874
REQUEST_METHOD = GET
REQUEST_URI = /cgi-bin/helloworld?Username=11&Password=222
SCRIPT_FILENAME = /root/cgi-bin/helloworld
SCRIPT_NAME = /cgi-bin/helloworld
SERVER_ADDR = 192.168.8.106
SERVER_NAME = 192.168.8.106
SERVER_PORT = 8080
SERVER_PROTOCOL = HTTP/1.1
SERVER_SOFTWARE = uHTTPd
3Openwrt自定义CGI实现 前后端交互的更多相关文章
- Django之META与前后端交互
Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...
- nodejs实现前后端交互
本人nodejs入门级选手,站在巨人(文殊)的肩膀上学习了一些相关知识,有幸在项目中使用nodejs实现了前后端交互,因此,将整个交互过程记录下来,方便以后学习. 本文从宏观讲述nodejs实现前后端 ...
- 微信小程序 + thinkjs + mongoDB 实现简单的前后端交互
说明:这段时间跟老师学习了一下mongodb数据库,这次也是第一次搭建后台服务,出了不少差错,特此来复盘一下,非常感谢对我提供帮助的同学~ 一.使用 thinkjs + mongodb 创建后台服务 ...
- Node.js实现前后端交互——用户注册
我之前写过一篇关于使用Node.js作为后端实现用户登陆的功能,现在再写一下node.js做后端实现简单的用户注册实例吧.另外需要说的是,上次有大佬提醒需要加密数据传输,不应该使用明文传输用户信息.在 ...
- Node之简单的前后端交互
node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...
- 前后端交互实现(nginx,json,以及datatable的问题相关)
1.同源问题解决 首先,在同一个域下搭建网络域名访问,需要nginx软件,下载之后修改部分配置 然后再终端下cmd nginx.exe命令,或者打开nginx.exe文件,会运行nginx一闪而过, ...
- springboot+mybatis+thymeleaf项目搭建及前后端交互
前言 spring boot简化了spring的开发, 开发人员在开发过程中省去了大量的配置, 方便开发人员后期维护. 使用spring boot可以快速的开发出restful风格微服务架构. 本文将 ...
- 百度ueditor的图片上传,前后端交互使用
百度ueditor的使用 一个文本编辑器,看了网上很多文档写的很乱,这里拾人牙慧,整理下怎么使用. 这个东西如果不涉及到图片附件上传,其实很简单,就是几个前端文件,直接引用,然后配置下ueditor. ...
- SSM-网站后台管理系统制作(4)---Ajax前后端交互
前提:Ajax本身就为前后端交互服务的,实现功能:用户输入信息,实时判断用户的情况,这也是现在登录界面普遍流行的做法.前端js通过注释识别Controller层,该层查询返回,和之前Google验证码 ...
随机推荐
- 使用 JWT 生成 Token 代码示例
JSON Web Token,简称 JWT, 是一个开放的标准(RFC 7519),它定义了以一种紧凑的.自包含的 JSON 对象在各方之间安全传输信息的方式.该信息含有数字签名,可以被验证和信任. ...
- 【从零开始搭建自己的.NET Core Api框架】(七)授权认证进阶篇
系列目录 一. 创建项目并集成swagger 1.1 创建 1.2 完善 二. 搭建项目整体架构 三. 集成轻量级ORM框架——SqlSugar 3.1 搭建环境 3.2 实战篇:利用SqlSuga ...
- Markdown 语法文档
Markdown 语法文档 前言 Markdown 是一种轻量级标记语言,创始人为約翰・格魯伯(英语:John Gruber); 它允许人们 "使用易读易写的纯文本格式编写文档,然后转换成有 ...
- SSD(single shot multibox detector)
SSD,全称Single Shot MultiBox Detector,是Wei Liu在ECCV 2016上提出的一种目标检测算法,截至目前是主要的检测框架之一,相比Faster RCNN有明显的速 ...
- Javascript高级编程学习笔记(91)—— Canvas(8) 阴影
阴影 2D上下文将会根据以下属性为形状或路径绘制阴影 shadowColor: 用于设置阴影颜色,默认为黑色 shadowOffsetX: 形状或路径X方向的阴影偏移量,默认为0 shadowOffs ...
- 【自然语言处理篇】--Chatterbot聊天机器人
一.前述 ChatterBot是一个基于机器学习的聊天机器人引擎,构建在python上,主要特点是可以自可以从已有的对话中进行学(jiyi)习(pipei). 二.具体 1.安装 是的,安装超级简单, ...
- 【机器学习】--LDA初始和应用
一.前述 LDA是一种 非监督机器学习 技术,可以用来识别大规模文档集(document collection)或语料库(corpus)中潜藏的主题信息.它采用了词袋(bag of words)的方法 ...
- kubernetes 存储卷
kubernetes 存储卷 数据卷用于实现容器持久化数据,Kubernetes对于数据卷重新定义,提供了丰富强大的功能.在Kubernetes系统中,当Pod重建的时候,数据卷会丢失,Kube ...
- LindDotNetCore~授权中间件的介绍
回到目录 LindDotNetCore中间件 大叔认识中间件就是主要对http请求进行拦截,然后添加具体个性化功能的逻辑,这种把请求切开,添加新逻辑的方式一般称为面向方面的逻辑AOP! 授权中间件 请 ...
- 微信公众号开发C#系列-10、长链接转短链接
1.概述 短网址的好处众多,便于记忆,占用字符少等,现在市面上出现了众多的将长网址转变为短网址的方法,但是由于他们都是小的公司在幕后运营,所以很不靠谱,面对随时关闭服务的可能,这样也导致我们将转换好了 ...