Openwrt自定义CGI实现
此文已由作者吴志勐授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
安装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
网易云免费体验馆,0成本体验20+款云产品!
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 Wireshark对HTTPS数据的解密
【推荐】 Kubernetes 在网易云中的落地优化实践
Openwrt自定义CGI实现的更多相关文章
- 3Openwrt自定义CGI实现 前后端交互
https://www.cnblogs.com/163yun/p/9834993.html 安装uhttpd. 在编译openwrt前,输入make memuconfig,查找Network -> ...
- OpenWrt自定义和官方一样的固件
我用的OpenWrt版本是Barrier Breaker 14.07,硬件是NetGear WNDR4300. 我自定义固件的目的是把固件的根分区扩到最大(100MB,总FLASH是128MB),试过 ...
- OpenWRT加入 crontab开机默认运行
[转载请注明出处:钱国正专栏 http://blog.csdn.net/qianguozheng/article/details/37666829] OpenWRT系统默认已经加入了crond,仅仅是 ...
- Perl的调试方法
来源: http://my.oschina.net/alphajay/blog/52172 http://www.cnblogs.com/baiyanhuang/archive/2009/11/09/ ...
- 网页控制脚本修改系统信息 C语言调用uci
0 交叉编译生成程序 http://tuntuntun.net/%E5%9C%A8OpenWrt%E4%B8%8A%E8%BF%90%E8%A1%8C%E7%AC%AC%E4%B8%80%E4%B8% ...
- 【OpenWRT之旅】如何自定义一个配置文件的设置界面
作者:gnuhpc 出处:http://www.cnblogs.com/gnuhpc/ 1. 引言 OpenWRT中采用LuCI作为它的Web interface界面框架,采用Lua语言.在本文中将以 ...
- 【转】OpenWRT开发自定义应用方法
[转]OpenWRT开发自定义应用方法 转自:http://blog.csdn.net/rudyn/article/details/38616783 OpenWRT编译成功完成后,所有的产品都会放在编 ...
- 如何在Openwrt上,针对内核创建自定义Patch?
参考资料: 1.http://wiki.openwrt.org/doc/devel/patches?s[]=quilt --- 官方对于如何打Patch的说明 2.http://blog.csdn ...
- 新手编译开发OpenWrt入门教程(自定义固件、ubuntu学习)
转自: http://www.znck007.com/forum.php?mod=viewthread&tid=21571 由于openwrt编译教程资料很多,不同的cpu芯片只需要选择对 ...
随机推荐
- Chapter 5 Blood Type——14
"You're wrong." His voice was almost inaudible. “你错了.” 他的声音几乎听不见 He looked down, stealing ...
- sql server 数据库创建链接服务器
本文介绍在sql server中创建链接服务器访问sql server数据库. 方法: 打开SSMS,新建程序,执行下面sql语句块: EXEC sp_addlinkedserver @server= ...
- [Go] golang缓冲通道实现资源池
go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...
- 50.Linux-分析ifconfig到内核的调用过程,实现内核启机自动设MAC地址(原)
内核版本: Linux version 3.10.14 1.由于每次开发板开机的网卡eth0的物理地址都是随机的. 然后在网上找到可以通过命令行实现设置mac物理地址: ifconfig eth0 d ...
- Java学习笔记之——异常处理
1.异常: 在程序运行时,发生了一些错误导致程序不能正常结束或者中断 2.异常导致的后果 Java程序的执行过程中如果出现异常事件,可以生成一个异常类对象,该异常对象封装了异常事件的信息,并将其被提交 ...
- JavaWeb - 模仿SpringMVC抽取 BaseServlet + 封装表单参数
模仿SpringMVC抽取一个BaseServlet,接收所有请求,然后自动封装表单参数和分发到对应的servlet执行,下面用一个页面表单提交,转发显示的项目做示例. 1)首先准备一个Entity, ...
- 【Dojo 1.x】笔记2 使用服务器环境及使用模块
又开坑了.上次静态html页面完成本地module的引用,算是成功了,但是并不知道是怎么运作的,没关系慢慢来. 我用的环境是VSCode,这次因为官方说要在服务器环境下运行,所以就用上了VSCode的 ...
- 请不要在广州.NET俱乐部群里谈郑智话题,谢谢!
收到私聊说代码无国界,但是程序员是有国界的,程序员也有关心国家大事的权力! 我是极度赞同“代码无国界,但是程序员是有国界的,”我也极度赞同程序员也要爱国. 因为我们新兴县六祖镇叶氏家族就有四位爱国 ...
- 逛csdn看见的一个知识阶梯,感觉不错
逛csdn看见的一个知识阶梯,感觉不错: 计算机组成原理 → DOS命令 → 汇编语言 → C语言(不包括C++).代码书写规范 → 数据结构.编译原理.操作系统 → 计算机网络.数据库原理.正则表 ...
- 支持scrollTo的RecycleView
RecycleView内部没有帮我们实现ScrollTo的方法,不过帮我们实现了ScrollBy,我们可以通过ScrollBy自定义一个支持scrollTo的RecycleView. public c ...