当前位置: 首页 > news >正文

ubuntu下boa服务器编译运行

一.下载boa源码并解压

官网网站:BOA源码

点击箭头所指的位置即可下载

解压:

tar -xvf boa-0.94.13.tar.gz

解压完成得到目录:

二.安装环境所缺依赖,否则编译会报错

sudo apt install bison sudo apt install flex

三.编译

1.生成Makefile

/boa-0.94.13/src$ ./configure

2.在src,执行make

and@and-VirtualBox:~/linux网络编程/boa/boa-0.94.13/src$ make bison -y -d boa_grammar.y gcc -g -O2 -pipe -Wall -I. -c -o y.tab.o y.tab.c y.tab.c: In function ‘yyparse’: y.tab.c:1191:16: warning: implicit declaration of function ‘yylex’ [-Wimplicit-function-declaration] yychar = yylex ();

会编译报错:

解决:

在src/compat.h文件120行

#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff 改为#define TIMEZONE_OFFSET(foo) foo->tm_gmtoff

编译完成会在src下面生成可执行文件boa

运行boa,出现报错

解决:创建/etc/boa目录 关于该目录的定义在 defines.h中。

继续运行,又报错

解决:

拷贝boa-0.94.13/boa.conf文件到/etc/boa目录下。

继续运行,又报错

注释掉:在src/log.c 72-74行

if (dup2(error_log, STDERR_FILENO) == -1) { DIE("unable to dup2 the error log"); }

又一个报错

解决:

AccessLog /var/log/boa/access_log 改为 #AccessLog /var/log/boa/access_log

发现改了也不行,后面把boa.conf cp到了etc/boa/下面进行了替换就OK了

修改url路劲

当前编译环境OK,需要修改boa.conf文件,因为我们输入url的时候,会在对应的路劲下面去找,如果路劲不对,就会找不到,页面出现404

在我的虚拟机下面,我放了如下文件

在boa.conf做如下修改

111行

DocumentRoot /home/and/www

最后一行

ScriptAlias /cgi-bin/ /home/and/www/cgi-bin/

其中/cgi-bin/指的就是当我们访问的文件带有cgi-bin字段的时候,就表示动态网页信息,因此我们的服务器,就会从后面的路劲/home/and/www/cgi-bin/下面去寻找此文件。

注意:这里的路劲使用绝对路径,否则出现找不到的情况。还有/cgi-bin/最后面的/一定不能缺少,不然还是找不到。

四.运行效果:

看一下进程运行情况

ps -a | grep "boa"

在index.html

<html> <head> <title>table</title> <meta charset="UTF-8"> </head> <body> 选择你的车型: <select> <option>BMW</option> <option>玛莎拉蒂</option> <option>火车</option> <option selected>宝骏</option> <option>自行车</option> </select> </body> </html>

效果如下:

在pass.html输入如下:

<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>用户登陆验证</title> </head> <body> <form name="form1" action="/cgi-bin/pass.cgi" method="POST"> <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>

在pass.c输入如下:

/*===================================================================== cgi例子 =====================================================================*/ //pass.c #include <stdio.h> #include <stdlib.h> #include <string.h> char* getcgidata(FILE* fp, char* requestmethod); int main(void) { char *input; char *req_method; char name[64]; char pass[64]; int i = 0; int j = 0; // printf("Content-type: text/plain; charset=iso-8859-1\n\n"); printf("Content-type: text/html\n\n"); printf("The following is query reuslt:<br><br>"); req_method = getenv("REQUEST_METHOD"); input = getcgidata(stdin, req_method); // 我们获取的input字符串可能像如下的形式 // Username="admin"&Password="aaaaa" // 其中"Username="和"&Password="都是固定的 // 而"admin"和"aaaaa"都是变化的,也是我们要获取的 // 前面9个字符是UserName= // 在"UserName="和"&"之间的是我们要取出来的用户名 for ( i = 9; i < (int)strlen(input); i++ ) { if ( input[i] == '&' ) { name[j] = '\0'; break; } name[j++] = input[i]; } // 前面9个字符 + "&Password="10个字符 + Username的字符数 // 是我们不要的,故省略掉,不拷贝 for ( i = 19 + strlen(name), j = 0; i < (int)strlen(input); i++ ) { pass[j++] = input[i]; } pass[j] = '\0'; printf("Your Username is %s<br>Your Password is %s<br> \n", name, pass); return 0; } char* getcgidata(FILE* fp, char* requestmethod) { char* input; int len; int size = 1024; int i = 0; if (!strcmp(requestmethod, "GET")) { input = getenv("QUERY_STRING"); return input; } else if (!strcmp(requestmethod, "POST")) { len = atoi(getenv("CONTENT_LENGTH")); input = (char*)malloc(sizeof(char)*(size + 1)); if (len == 0) { input[0] = '\0'; return input; } while(1) { input[i] = (char)fgetc(fp); if (i == size) { input[i+1] = '\0'; return input; } --len; if (feof(fp) || (!(len))) { i++; input[i] = '\0'; return input; } i++; } } return NULL; }

编译为pass.cgi

编译 gcc pass.c -o pass.cgi 并赋予权限,一般我都是直接拉满 chnod 777 pass.cgi

运行效果:

http://www.jsqmd.com/news/1387387/

相关文章:

  • 揭秘长春网站建设phpjz背后的技术逻辑与本地化服务深度解析
  • 消息刚发出就被撤回?RevokeMsgPatcher 微信/QQ/TIM 防撤回补丁完整指南
  • 上海嘉定网站建设:从0到1的实战避坑指南,老板必看的企业数字化转型之路
  • 宣城市泾县OEM白标贴牌GEO服务商怎么选?2026年本地企业靠谱推荐与选型指南 - 子柔传媒
  • 2026福州仓山区楼顶漏水避坑指南,本地老牌公司,质保可查 - 专业防水施工
  • vue中使用腾讯API地图,实现搜索关键词获取经纬度和地址并显示地图
  • 池州市石台县OEM白标贴牌GEO服务商怎么选?2026年靠谱推荐与选择指南 - 科技快讯
  • 从零开始的单元测试:csharp_with_csharpfritz教你构建可靠C代码
  • 2026年合肥市包河区GEO服务商代理加盟本地靠谱推荐:城市合伙人模式解析 - 企业新闻快传
  • lamp-boot表单校验前后端统一验证:提升数据安全性的关键步骤
  • 济南网站建设工作室如何选择靠谱团队避坑指南与实战经验全解析
  • Windows微信QQ防撤回神器:3分钟永久保留重要消息
  • 搞笑视频瞬间变表情包!2026免费GIF制作完整攻略,两种主流工具保姆级教程 - 时时资讯
  • 【路径规划】基于遗传算法结合粒子群算法求解TSP问题matlab代码
  • 铜陵市枞阳县OEM白标贴牌GEO服务商怎么选?2026年靠谱推荐与判断标准 - 企业新闻快传
  • 30分钟完成黑苹果配置:OpCore-Simplify终极指南让OpenCore EFI创建变得简单快速
  • 蓝队实战笔记:一次 BOLA 越权攻击的防守复盘——从告警发现到溯源加固
  • 不为人知的开源硬件控制工具:告别后台弹窗,把游戏本还给自己
  • 朋友圈九宫格发图总错位、对不齐?2026两套免费方案|一键分割,像素级精准不翻车 - 时时资讯
  • AI论文网站最全盘点:从语法纠错到查重降AI,这一篇承包你的全部痛点 - 论文助教
  • 如何快速掌握Hap QuickTime Codec:专业视频编码终极教程
  • 东莞网站建设多少钱,资深老哥掏心窝子告诉你底价与避坑指南
  • 滁州市来安县OEM白标贴牌GEO服务商怎么选?2026年靠谱推荐与避坑指南 - 小随科技
  • Docker部署Garage-WebUI教程:简单高效的分布式存储解决方案
  • 鸣潮自动化工具ok-ww完整指南:解放双手的智能游戏助手
  • 花都网站建设公司哪家强?揭秘本地专业团队如何帮企业打造高转化官网
  • 上海html5网站建设如何实现企业品牌价值的最大化提升
  • MobaXterm中文版:一体化远程管理的技术革新方案
  • r8brain-free-src常见问题解答:解决音频重采样中的99%难题
  • 大麦网抢票脚本逆向工程:从零构建自动化购票系统的完整指南