openwrt用uhttpd自定义一个网页服务器&用shell写CGI处理程序

最近折腾https证书的时候,发现openwrt的网页服务器uhttpd可以定义自己的网站,然后就自己建了一个,
本来准备把连上路由器的设备像airport,肯德基那样web访问首先用iptables重定向到自己的页面搞个认证什么的。
结果发现,新版openwrt的nfttables命令风格都变了,还需要研究一下,后面发现uhttpd用shell就可以写简单的
cgi处理程序,不用深入研究lua脚本语言,这就有点意思了,于是,试了试,记录一下折腾过程,有兴趣的可以
试试
在这里插入图片描述
首先要安装uhttpd的luci配置包,可以用下面的命令安装:

opkg update && opkg install luci-app-uhttpd luci-i18n-uhttpd-zh-cn

在这里插入图片描述
安装好以后,luci管理界面–服务–uhttpd,往下拉,在旁边的框里面输入名字,然后点“添加”就会新增加一个
网页服务器,然后稍微配置一下。

在这里插入图片描述
常规设置–监听端口,http或者https 随便设置一个,如果开了https重定向,建议配置给https,端口设置成80和443之外的,
不要和路由管理端口冲突。我的是设置成了8080。

在这里插入图片描述
完整的web服务器设置,索引页面设置一下,我的设置成了静态的index.html, 当然,后面需要你的web根目录有对应的文件,
为了防止一打开url就成了ftp网页服务器,把"不要生成目录列表" 勾选一下。

在这里插入图片描述
高级设置,把“文件根”也就是网站根目录设置一下,为了安全,我是设置在挂载U盘的/ff/www文件夹下面了,“CGI脚本的路径前缀”
要设置一下,这个挺关键,因为uhttpd解析url的时候看到这个/cgi知道是要fork cgi程序处理网页的请求了,没太研究明白把这个弄成
虚拟的,看了openwrt默认管理web服务器是 在web根目录创建一个和cgi前缀同名的文件夹,然后下面的子目录软连接过来,似乎也能起到
虚拟隐藏的作用,我也照葫芦画瓢,在/ff/www下创建一个名叫cgi文件夹,把shell写的名为siglog的cgi处理脚本放里面,然后chmod +x /ff/www/cgi/siglog
授运行权,浏览器输入 https://路由器lanIP:自定义的端口/cgi/siglog 真就可以运行,返回也没有问题,当然这个脚本写法有讲究,后面再说!

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后,做成的一个非常简陋的网站,效果如上图,就是静态索引首页有一个链接,点击以后,控制权就交给了用
shell写的cgi处理脚本,脚本会把我的一个不断生成日志文件(日志是另外一个监控中继的母wifi信号强度的定时
运行脚本生成的) 分页显示出来,点击每个分页链接,会把相应id 用get方法传给shell cgi脚本,然后脚本生成
对应的页面,灰常灰常简陋的页面,没有用css,JavaScript… 原始html,别问为什么,问就是因为我快把css,js
忘光了!

index.html 代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Log_about</title>
</head>

<body>
    <a href="/cgi/siglog" title="signal_daemon_log" target="_self"><font size="4" color="blue" face="微软雅黑"></font>1. Wifi Signal Daemon L0G</a>
</body>

</html>

siglog shell脚本代码:

#!/bin/ash

echo "Content-Type:text/html;charset=utf-8"
echo

[ -n $QUERY_STRING ] && for x in $(echo $QUERY_STRING | tr "&" " "); do eval $x; done
[ ! $dat ] && dat=$(date +%y%m%d)
logpth="/ff/sig_log/sig_daemon_${dat}.log"
ls $logpth &>/dev/null
if [ $? -ne 0 ]; then
    subj="Signal_Daemon_${dat}.log is not exist..."
    cat <<AAA
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
AAA
    echo "<title>Signal_Daemon_L0G -> Error</title>"

    cat <<AAA
</head>
<body>
AAA
    echo "<h1><font color='red'>${subj} </font></h1>"
    echo '<a href="/index.html" title="back to main page" target="_self"><font size="2" color="red" face="微软雅黑"></font><--</a>'
    cat <<AAA
</body>
</html>
AAA
    exit 1
else
    subj="Signal_Daemon_${dat}.log"
    fy=3
    zys=$(sed -n '/^Result/=' ${logpth} | wc -l)
    ids=$(expr $zys / $fy)
    [ $(expr $zys % $fy) -ne 0 ] && let ids++
    if [ ! $id ] || [ $id -lt 1 ]; then
        id=1
    fi
    [ $id -gt $ids ] && id=$ids
    e=$(expr $zys - $(expr $(expr $id - 1) \* $fy))
    h=$(expr $zys - $(expr $id \* $fy))
    fye=$(sed -n '/^Result/=' ${logpth} | sed -n "${e}p")
    if [ $h -lt 1 ]; then
        fyh=1
    else
        fyh=$(expr $(sed -n '/^Result/=' ${logpth} | sed -n "${h}p") + 2)
    fi

    cat <<AAA
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
AAA
    echo "<title>Signal_Daemon_L0G -> ${id}</title>"

    cat <<AAA
</head>
<body>
AAA
    echo "<h1> ${subj} </h1>"
    echo '<a href="/index.html" title="back to main page" target="_self"><font size="2" color="red" face="微软雅黑"></font><--</a>'
    for i in $(seq 1 ${ids}); do
        echo "&nbsp;<a href='/cgi/siglog?dat=${dat}&id=${i}' title='page[${i}]' target='_self'><font size='2' color='red' face='微软雅黑'></font>${i}</a>"
    done
    # echo "&nbsp;&nbsp;<font size='2' color='red' face='微软雅黑'>Page: [${id}]</font>"
    echo
    echo '<pre><font size="2" color="blue" face="微软雅黑">'
    sed -n "${fyh},${fye}p" ${logpth}
    echo '</pre></font>'
    echo
    cat <<AAA
</body>
</html>
AAA
    exit 0
fi

简单说一下,这个shell cgi的写法,关键是开头这两句 :

echo "Content-Type:text/html;charset=utf-8"
echo

这两句是写给 http响应头的,差不多是默认写法吧,在后面基本就是echo html代码了,$QUERY_STRING 是访问页面用get传参后放在里面的变量,
基本就是围绕这个写代码,懂http原理的应该很容易明白,post进来的数据怎么处理,这些是http相关知识,自行度娘学习!

好了, 睡觉了,有兴趣的朋友去研究吧,生命不息,折腾不止。。。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值