Jiahonzheng's Blog

OpenWrt h3c 客户端编译

字数统计: 841阅读时长: 3 min
2018/12/11 Share

由于 oh3c 客户端在路由器经常出现连接不稳定的情况(可能由于路由器体质不好,不能很好支撑 Python 的运行),因此决定采用由 C 语言开发的 sysuh3c 客户端。

路由器:OpenWrt 15.05 / ar71xx

坐标:中山大学东校区

环境搭建

由于路由器存储空间不足以安装 gcc ,因此选择了交叉编译的方式构建客户端。为保证依赖不对宿主机造成影响,这里选择了 Docker 构建编译环境。

注意:本文使用 SDK 工具版本号为 OpenWrt 15.05。理论上来说,本篇教程适用各种版本的 SDK 和各种的路由器硬件。

Dockerfile

为了构建编译镜像,我们需要编写 Dockerfile 配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
FROM ubuntu:16.04

# 安装 OpenWrt SDK 所需依赖
RUN apt-get update &&\
apt-get install -y sudo wget build-essential subversion libncurses5-dev \
zlib1g-dev gawk gcc-multilib flex git-core gettext \
libssl-dev ccache vim &&\
apt-get clean

# 新建用户
RUN useradd -m openwrt &&\
echo 'openwrt ALL=NOPASSWD: ALL' > /etc/sudoers.d/openwrt

# 设置工作区目录
USER openwrt
WORKDIR /home/openwrt

# 下载 OpenWrt 15.05 SDK
RUN wget https://mirrors.tuna.tsinghua.edu.cn/openwrt/chaos_calmer/15.05/ar71xx/generic/OpenWrt-SDK-15.05-ar71xx-generic_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64.tar.bz2

RUN tar -jxvf *.tar.bz2
RUN rm -f *.tar.bz2

# 设置环境变量
RUN sudo bash -l -c 'echo export TOOLCHAIN_ROOT="$(pwd)/$(ls | grep OpenWrt)/staging_dir/$(ls $(pwd)/$(ls | grep OpenWrt)/staging_dir | grep toolchain)" >> /etc/bash.bashrc'
RUN sudo bash -l -c 'echo export TARGET_ROOT="$(pwd)/$(ls | grep OpenWrt)/staging_dir/$(ls $(pwd)/$(ls | grep OpenWrt)/staging_dir | grep target)" >> /etc/bash.bashrc'

在编写完配置后,我们需要通过以下命令生成标签为 openwrt 的镜像。

1
docker build . -t openwrt

编译

首先,我们需要根据镜像 openwrt ,建立一个实例,并进入到实例中。

1
docker run -it openwrt

本次编译的客户端源码来自 github.com/zonyitoo/sysuh3c ,故在实例中,我们需要克隆此仓库。

1
git clone -b openwrt https://github.com/zonyitoo/sysuh3c.git

Makefile

为保证能够正确调用 OpenWrt 编译链,我们需要将 sysuh3c/src/ 下的 Makefile 修改为以下的内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CC = ${TOOLCHAIN_ROOT}/bin/mips-openwrt-linux-gcc

CFLAGS += -luci -I${TARGET_ROOT}/usr/include -I${TOOLCHAIN_ROOT}/include
LDFLAGS += -luci "--sysroot=${TARGET_ROOT}"

sysuh3c: main.o eapauth.o eaputils.o md5.o
$(CC) $(LDFLAGS) $^ -o $@

main.o: main.c eapauth.h eapdef.h
$(CC) $(CFLAGS) -c -o $@ $<

eapauth.o: eapauth.c eapauth.h eapdef.h
$(CC) $(CFLAGS) -c -o $@ $<

eaputils.o: eaputils.c eaputils.h eapdef.h
$(CC) $(CFLAGS) -c -o $@ $<

md5.o: md5.c md5.h
$(CC) $(CFLAGS) -c -o $@ $<

clean:
rm -f *.o sysuh3c

sysuh3c/src 目录下,我们可通过 make 指令编译客户端。

1
2
3
# 进入源码目录,进行编译
cd sysuh3c/src
make

PS: 编译过程会出现 warnings 提示,但不影响可执行文件的生成。

在编译完成后,我们可发现当前目录出现了名为 sysuh3c 的可执行文件,我们仅需将该文件通过 scp 等方式上传至路由器,运行即可。

在使用 scp 上传文件至路由器时,可能会出现 Read-only file system 的错误,这时只需重新挂载路由器的文件系统即可。

1
mount -o remount rw /

使用

在使用过程中,请务必选择正确的网卡名称,可通过 ifconfig 指令获取网卡名称。

1
2
3
4
# NetID: test
# Password: 123456
# Interface: eth1 (请根据实际网卡接口名称填写)
./sysuh3c -u test -p 123456 -i eth1 -d

相关资料

CATALOG
  1. 1. 环境搭建
    1. 1.1. Dockerfile
  2. 2. 编译
    1. 2.1. Makefile
  3. 3. 使用
  4. 4. 相关资料