索引
这一期会介绍这一阶段的学习:
1. boa服务器的移植与测试
2. HTML控制4412的led灯亮灭(局域网)
3. 内网穿透实现外网控制
4. 花生壳的移植与开机自启动
接下来进入本篇正题:
一 准备本次内容
链接:https://pan.baidu.com/s/1_XX-X6JZwt9YMLl8b99yYw
提取码:0qhr
材料介绍:
| boa-0.94.13.tar.gz | boa服务器安装包 |
| html_test.tar.gz | 对应html测试程序 |
| cgi_test.tar.gz | 对应cgi测试程序 |
| cgic205.tar.gz | cgic网关接口移植包 |
二 移植boa服务器
1.修改配置(Ubuntu下)
解压boa-0.94.13.tar.gz源码
tar -xvf boa-0.94.13.tar.gz
安装需要工具bison,flex:
sudo apt-get install bison flex
进入 解压得到的boa-0.94.13/目录下,修改 src/compat.h:
vi compat.h +120
将
#define TIMEZONE_OFFSET(foo) foo##->tm_gmtoff
修改为
#define TIMEZONE_OFFSET(foo) (foo)->tm_gmtoff
修改 src/log.c:
vi log.c +72
注释掉
if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
为
/*if (dup2(error_log, STDERR_FILENO) == -1) {
DIE("unable to dup2 the error log");
}
*/
修改src/boa.c: vi boa.c +209
将
passwdbuf = getpwuid(server_uid);
if (passwdbuf == NULL) {
DIE(”getpwuid”);
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE(”initgroups”);
}
改为
#if 0
passwdbuf = getpwuid(server_uid);
if (passwdbuf == NULL) {
DIE("getpwuid");
}
if (initgroups(passwdbuf->pw_name, passwdbuf->pw_gid) == -1) {
DIE("initgroups");
}
#endif
将
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
为
#if 0
if (setuid(0) != -1) {
DIE(”icky Linux kernel bug!”);
}
#endif
修改src/defines.h
vi defines.h +30
将
#define SERVER_ROOT "/etc/boa"
修改为
#define SERVER_ROOT "/boa"
//此处为boa服务器位置,根据自己设置的位置填写正确
(这样boa程序启动时会在/boa目录下寻找boa.conf配置文件,并且将/boa文件夹作为服务器的根目录)。
执行./configure:
./configure
这是根据configure.in文件进行一系列的配置,生成config.status,configure,和Makefile文件。
如果无法执行,考虑权限,修改该目录下的configure的属性为可执行 chmod 777 configure
编译ubuntu的boa服务器
make
进入boa-0.94.13 目录下,修改boa.conf文件(Boa的配置):
cd ..
vi boa.conf
重新指定一些文件的生成路径,因为重新指定这些路径后会帮助我们深刻的理解关于boa服务器的工作机
Port 80
User 0
Group 0
bind调用的IP地址,一般注释掉,表明绑定到INADDR_ANY,通配于服务器的所有IP地址
error_log和access_log会自动生成,只要指定生成路径就可以了。
ErrorLog /boa/log/error_log
AccessLog /boa/log/access_log
存放HTML文件的根路径
DocumentRoot /boa/www
UserDir public_html
默认页面,若输入http://127.0.0.1/则会自动返回给浏览器默认页面index.html
DirectoryIndex index.html
irectoryMaker /boa/boa_indexer //被修改
KeepAliveMax 1000
KeepAliveTimeout 10
MimeTypes /boa/mime.types //被修改
DefaultType text/plain
指定传给cgi程序的PATH环境变量
CGIPath /bin:/usr/bin:/usr/local/bin
Alias /doc /usr/doc
ScriptAlias /cgi-bin/ /boa/cgi-bin/
如果输入http://127.0.0.1/cgi-bin/test.cgi, 则boa服务器会到/boa/cgi-bin中寻找test.cgi程序。
在根目录下,创建boa目录
mkdir /boa
在boa目录下创建文件夹
sudo mkdir -p /boa /boa/www /boa/cgi-bin /boa/log
将需要的文件复制到安装目录中
将boa-0.94.13目录下的 boa.conf拷贝到 /boa
sudo cp boa.conf /boa
将boa-0.94.13/src目录下生成的boa、boa_indexer二进制文件复制到/boa
sudo cp src/boa src/boa_indexer /boa
将/etc/mime.types复制到/boa目录下
sudo cp /etc/mime.types /boa
此时整个boa服务器移植完成,但是还需要测试boa服务器是否移植成功
2.测试Ubuntu下的boa服务器
解压html_test.tar.gz
tar -xvf html_test.tar.gz
将解压下的www目录覆盖 /boa/www
sudo cp -r www /boa
解压cgi_test.tar.gz
tar -xvf cgi_test.tar.gz
进入解压得到的cgi-bin文件夹中编译c文件得到对应的cgi
gcc -o test.cgi test.c
将得到的test.cgi移动到/boa/cgi-bin/下
cp test.cgi /boa/cgi-bin/
ok,打开浏览器
本机回环测试输入127.0.0.1
出现如图说明:没有启动服务器
我们在终端输入
./boa/boa
重新打开浏览器
点击 to cgi page 会显示
至此Ubuntu下的boa服务器移植成功
3.移植到4412开发板
在boa-0.94.13/src/目录下进行以下操作:
make clean
用于清除之前make生成的ubuntu虚拟机可执行文件
修改Makefile
vi Makefile
修改CC = gcc 为 CC = arm-linux-gcc
修改CPP = gcc -E 为 CC = arm-linux-gcc -E
保存,再执行
make
生成用于4412开发板的执行文件
为生成的二进制文件boa瘦身:
arm-linux-strip boa
将/boa 备份到csdn/目录下,用于生成开发板的boa服务器
sudo cp -r /boa /home/topeet/csdn
将现在的 boa boa_indexer 移动到csdn/boa/
sudo cp boa boa_indexer ../../../boa
进入到解压得到的cgi-bin/文件夹,编译4412上的 test.cgi
arm-linux-gcc -o test.cgi test.c
并将得到的test.cgi移动到4412的boa/cgi-bin/目录下
sudo cp test.cgi ../boa/cgi-bin/
使用tf卡将这个boa服务器放置在开发板的根目录下
打开和开发板有网络连接平台的浏览器
输入开发板的ip
好了,出现了和ubuntu虚拟机上一样的效果
三 移植cgic库
1. 解压cgic205.tar.gz
tar -xvf cgic205.tar.gz
cd cgic205
2. 先做ubuntu虚拟机的
直接make
将得到的capture和cgictest.cgi移动到/boa/cgi-bin/目录下
sudo cp capture cgictest.cgi /boa/cgi-bin/
3. 回环测试
浏览器里输入
http://127.0.0.1/cgi-bin/cgictest.cgi
得到如图则说明成功
4. 编译4412开发板的
先make clean
清除一下
修改Makefile文件,
找到CC=gcc,将其改成CC=arm-linux-gcc,
找到AR=ar,将其改成AR=arm-linux-ar,
找到RANLIB=ranlib,将其改成RANLIB=arm-linux-ranlib。
找到gcc cgictest.o -o cgictest.cgi
L
I
B
S
,
将
其
改
成
{LIBS},将其改成
LIBS,将其改成(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS},
找到gcc capture.o -o capture
L
I
B
S
,
将
其
改
成
{LIBS},将其改成
LIBS,将其改成(CC) $(CFLAGS) capture.o -o capture ${LIBS},
保存退出。
修改Makefile后为:
CFLAGS=-g -Wall
CC=arm-linux-gcc
AR=arm-linux-ar
RANLIB=arm-linux-ranlib
LIBS=-L./ -lcgic
all: libcgic.a cgictest.cgi capture
install: libcgic.a
cp libcgic.a /usr/local/lib
cp cgic.h /usr/local/include
@echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include.
libcgic.a: cgic.o cgic.h
rm -f libcgic.a
$(AR) rc libcgic.a cgic.o
$(RANLIB) libcgic.a
#mingw32 and cygwin users: replace .cgi with .exe
cgictest.cgi: cgictest.o libcgic.a
$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}
capture: capture.o libcgic.a
$(CC) $(CFLAGS) capture.o -o capture ${LIBS}
clean:
rm -f *.o *.a cgictest.cgi capture
5. 编译测试
make
后得到的capture和cgictest.cgi 移动到开发板的cgi-bin/下
打开和开发板有网络连接平台的浏览器
输入http://192.168.1.230/cgi-bin/cgictest.cgi
测试发现
这时需要修改权限。
chmod 777 capture
chmod 777 cgictest.cgi
再进行测试,结果与虚拟机相同效果
6. 补充
两个命令的学习:
ar命令可以用来创建、修改库,也可以从库中提出单个模块。库是一单独的文件,
里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)
原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。
cgi文件分析
cd cgic205-arm
里面有大约10个文件:
cgic.h:头文件;
cgic.c:CGIC的源代码文件;
cgictest.c:CGIC库的作者提供的一个CGI程序例子;
capture.c:用于调试CGI程序的工具;
Makefile:安装CGIC的脚本文件;
可以看到,整个库实际上就是cgic.c一个文件,可以说是非常的精炼。
可以把CGIC安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有cgic.c这个源文件了。
但是由于需要(以后将会看到),我们将修改cgic.c代码,所以我们不把它安装进系统。每次编译的时候,只要把cgic.c和cgic.h放到当前文件夹就好了。