Openwrt自定义CGI实现

摘要:
在编译openwrt之前,输入makememuconfig以查找Network-˃WebServers/proxys-˃uhttpd。如果未选中,请选中它。安装并运行openwrt后,通过ssh登录,修改/etc/config/uhttpd配置文件,并在文件末尾添加新的web服务。例如,前一步中的/cgi-bin/helloworld是用于web服务的cgi程序。本文介绍了通过ipk方式安装CGI程序的方法。ipk的生成需要openwrt的交叉编译。首先,在openwrt目录下的package目录下创建一个目录。这个例子是:helloworld。

此文已由作者吴志勐授权网易云社区发布。

欢迎访问网易云社区,了解更多网易技术产品运营经验。

安装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_httpCGI前缀,用来区分是否调用的CGI
cgi_prefixCGI前缀,用来区分是否调用的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 
", env_var[i], value); 

 printf("<p>"); 

    } 

  } 
} 

 
int main(){ 
printf("Content-Type:text/html;charset=utf-8

"); 
printf("<html>
"); 
printf("<head>
<title>test</title>
</head>
"); 
printf("<body>
"); 
printf("<p>"); 
printf("hello~
"); 
printf("</p>"); 
list_argument(); 
printf("</body>
"); 
printf("</html>
"); 
}

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+款云产品! 

更多网易技术、产品、运营经验分享请点击


相关文章:
【推荐】 MongoDB复制集成员及状态转换
【推荐】 django项目在uwsgi+nginx上部署遇到的坑
【推荐】 react技术栈实践(1)

免责声明:文章转载自《Openwrt自定义CGI实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇tfgan折腾笔记(二):核心函数详述——gan_model族IIS 平台NET无后缀名伪静态实现办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

dup和dup2用法小结

今天和同学探讨了一下关于重定向输出到文件的问题,其中需要用到dup和dup2函数,因此来小小的总结一下。 首先来man一下: dup直接返回一个新的描述符和原来的描述符一样代表同一个资源,描述符的值就从当前未使用的最小的描述符来取。而dup2则是可以指定描述符的值,这样通过把文件的描述符指定为STDOUT_FILENO,这样就相当于重定向输出为文件了。...

C#开发微信门户及应用(26)-公众号微信素材管理

微信公众号最新修改了素材的管理模式,提供了两类素材的管理:临时素材和永久素材的管理,原先的素材管理就是临时素材管理,永久素材可以永久保留在微信服务器上,微信素材可以在上传后,进行图片文件或者图文消息的发送,关注的公众号可以在素材有效期内查看相关的资源,对于永久素材,那就不会存在过期的问题,只是纯粹数量上限的限制。本文综合两方面进行介绍素材管理的各种接口...

软路由系统记录

openwrt openwrt中文网:http://www.openwrt.org.cn 恩山论坛:https://www.right.com.cn/forum/ openwrt官网:https://openwrt.org/ 爱快 官网:https://www.ikuai8.com/ Tips:x86平台 32位或64位 LEDL 官网:ht...

基于第三方开源库的OPC服务器开发指南(3)——OPC客户端

本篇将讲解如何编写一个OPC客户端程序测试我们在前文《基于第三方开源库的OPC服务器开发指南(2)——LightOPC的编译及部署》一篇建立的服务器。本指南的目的是熟悉OPC服务器的开发流程,所以客户端部分我就不做过多描述,只是简单讲解几个关键技术细节及其实现函数,完整工程源码请从如下地址获取: https://github.com/Neo-T/OPCDA...

fastcgi apache fcgi

 FastCGI 安装与配置相关软件包:httpd 2.2.14      //注意版本 这个版本不会出问题   注:apache httpd安装  fcgi-2.4.0.zipmod_fastcgi-2.4.6.zip 请仔细阅读其中的README  php 5.2.17 配置apache: (默认安装在/usr/local 文件夹下) #配置http...

sscanf 函数

 sscanf 函数: 从一个字符串中读进与指定格式相符的数据.     头文件: #include<stdio.h>   返回值:  sscanf("1 2 3","%d %d %d",buf1, buf2, buf3); 成功调用返回值为3,即buf1,buf2,buf3均成功转换。       sscanf("1 2","%d %d %d...