找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 1630|回复: 3

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

[复制链接]
发表于 2023-1-14 23:23 | 显示全部楼层 |阅读模式
本帖最后由 null666666 于 2023-3-16 13:07 编辑

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





首先要安装uhttpd的luci配置包,可以用下面的命令安装:
  1. 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 代码:
  1. <!DOCTYPE html>
  2. <html lang="en">

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

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

  12. </html>
复制代码
siglog shell脚本代码:
  1. #!/bin/ash

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

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

  16.     cat <<AAA
  17. </head>
  18. <body>
  19. AAA
  20.     echo "<h1><font color='red'>${subj} </font></h1>"
  21.     echo '<a href="/index.html" title="back to main page" target="_self"><font size="2" color="red" face="微软雅黑"></font><--</a>'
  22.     cat <<AAA
  23. </body>
  24. </html>
  25. AAA
  26.     exit 1
  27. else
  28.     subj="Signal_Daemon_${dat}.log"
  29.     fy=3
  30.     zys=$(sed -n '/^Result/=' ${logpth} | wc -l)
  31.     ids=$(expr $zys / $fy)
  32.     [ $(expr $zys % $fy) -ne 0 ] && let ids++
  33.     if [ ! $id ] || [ $id -lt 1 ]; then
  34.         id=1
  35.     fi
  36.     [ $id -gt $ids ] && id=$ids
  37.     e=$(expr $zys - $(expr $(expr $id - 1) \* $fy))
  38.     h=$(expr $zys - $(expr $id \* $fy))
  39.     fye=$(sed -n '/^Result/=' ${logpth} | sed -n "${e}p")
  40.     if [ $h -lt 1 ]; then
  41.         fyh=1
  42.     else
  43.         fyh=$(expr $(sed -n '/^Result/=' ${logpth} | sed -n "${h}p") + 2)
  44.     fi

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

  51.     cat <<AAA
  52. </head>
  53. <body>
  54. AAA
  55.     echo "<h1> ${subj} </h1>"
  56.     echo '<a href="/index.html" title="back to main page" target="_self"><font size="2" color="red" face="微软雅黑"></font><--</a>'
  57.     for i in $(seq 1 ${ids}); do
  58.         echo "&nbsp;<a href='/cgi/siglog?dat=${dat}&id=${i}' title='page[${i}]' target='_self'><font size='2' color='red' face='微软雅黑'></font>${i}</a>"
  59.     done
  60.     # echo "&nbsp;&nbsp;<font size='2' color='red' face='微软雅黑'>Page: [${id}]</font>"
  61.     echo
  62.     echo '<pre><font size="2" color="blue" face="微软雅黑">'
  63.     sed -n "${fyh},${fye}p" ${logpth}
  64.     echo '</pre></font>'
  65.     echo
  66.     cat <<AAA
  67. </body>
  68. </html>
  69. AAA
  70.     exit 0
  71. fi

复制代码
简单说一下,这个shell cgi的写法,关键是开头这两句 :
  1. echo "Content-Type:text/html;charset=utf-8"
  2. echo
复制代码
这两句是写给 http响应头的,差不多是默认写法吧,在后面基本就是echo html代码了,$QUERY_STRING 是访问页面用get传参后放在里面的变量,
基本就是围绕这个写代码,懂http原理的应该很容易明白,post进来的数据怎么处理,这些是http相关知识,自行度娘思考!


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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
发表于 2023-1-15 08:04 | 显示全部楼层
我想搞个固件专门用来播放音乐和手机推送音频给路由的,因为不是用作网络设备,所以想把luci界面改成我需要播放操作的那一个luci-app-xx的界面,不需要登陆密码,登陆192.168.x.1就能进去的,不知道怎么搞

点评

这个有点复杂了,整不了,最起码得会lua了  详情 回复 发表于 2023-1-15 12:57
回复 支持 反对

使用道具 举报

发表于 2023-1-15 09:31 | 显示全部楼层
思考思考
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-15 12:57 | 显示全部楼层
xinyu1727 发表于 2023-1-15 08:04
我想搞个固件专门用来播放音乐和手机推送音频给路由的,因为不是用作网络设备,所以想把luci界面改成我需要 ...

这个有点复杂了,整不了,最起码得会lua了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-6-11 16:22

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表