跟我用路由器学Linux编程实例四

专栏目录

第一章 简单编程实现花生壳的ddns功能
第二章 让花生壳ddns脚本自动工作
第三章 同时解析多个花生壳域名的脚本
第四章 具有通用性的花生壳ddns脚本

用折腾路由的兴趣,顺便入门shell编程。


第四章 具有通用性的花生壳ddns脚本

文章目录

  • 专栏目录
    • 第四章 具有通用性的花生壳ddns脚本
    • 前言
    • 一、先复习一下
    • 二、写一个配置文件
    • 三、处理用户输入信息
    • 四、最后完成作品
    • 小结


前言

作者为了这个专栏准备了4个在线的路由(padavan、openwrt(amd64)、梅林380、梅林386)一台Linux主机(ubuntu),仅让4个路由全在线都废了不少事,各位看官能不踊跃订阅吗~
上一章我们只学了一个新命令let用于整数计算,但是我们重点学习了函数的写法,for循环的用法。这两个比什么新命令都重要!函数用花括号界定边界,for循环用do…done界定。上一章最后说了,这一章是要打造一个有脸放上github的脚本…


一、先复习一下

我们先把上一章最后完成的作品拿来再看看,看是否还缺点啥呢

#!/bin/shuser="用户名"
pass="密码"
resolve() {
curl -s  "http://$user:$pass@ddns.oray.com/ph/update?hostnam=$1"
}
for host in 'a.oray.com' 'b.oray.com' 'c.oray.com' 'd.oray.com'doresolve $hostsleep 5done

好像写得挺好的啊,越看越有程序美感,最多缺了个使用说明README!

这个代码你自己用或交给程序员用,那是没什么问题了。可你交给普通用户用,你让用户去改你的代码吗?你不怕他改少了个引号吗?user=“user” ,普通用户能给你改出N朵花来哦~ 笔者亲自指导过亲妹妹填入一个网址用来连接我做的一个服务,她给我整成这样http://xxx.xxx.xxx:8080/xxx/xxx (在那个软件里中文冒号和英文冒号区别很小,又因为后面跟着//本来就分得比较开,仔细看都不能确定是不是全角符号,且后一个端口号前的冒号肯定是正确的)乍一看没什么问题啊,笔者就经历了从服务器上的业务代码到nginx的代理一条龙的找问题…不堪回首啊!这种跑几十公里插网线,改标点符号的事,搞运维的兄弟一说起来那满满的都是泪,三天也说不完!

所以我们得尽量避免这种低级错误,并且你也不能让普通用户去改你的代码,大概率会少掉或多出些一些标点符号和空格,因为在普通人看来少个标点、多个空格那叫问题吗?一点也不影响阅读理解嘛!但在程序看来是大问题,大概率就出错。

那么我们怎么办呢?直接给出一个文件让用户填写必要的信息,我们用前面学习过的cat命令来抓取,并且进行一些低级错误的修正。比如去掉空格,改正大小写等问题。

二、写一个配置文件

配置文件需要用户填写的内容也不多嘛,一个用户名、一个密码、n个域名

# 在=后面填写信息, “domain=”一行一个,可自行添加。不要删除本行内容!
user=
pass=
domain=
domain=

好了,我们给出这么一个文件当配置文件,可以起个有linux风格名字叫conf或者叫phddns.conf啥的看你喜欢了,把它和前面写的phddns放一起上传放入/jffs/scripts/

现在我们去路由器看看吧:

admin@RT-AC3100-88B0:/jffs/scripts# cat phddns
#!/bin/shuser="用户名"
pass="密码"
resolve() {
curl -s  "http://$user:$pass@ddns.oray.com/ph/update?hostnam=$1"
}
for host in 'a.oray.com' 'b.oray.com' 'c.oray.com' 'd.oray.com'do# 笔者将这一行原本用来修改ddns解析的换成了显示网址,避免真去解析echo "http://$user:$pass@ddns.oray.com/ph/update?hostnam=$host"sleep 5done

然后我们在conf文件中填入数据,故意多个空格啥的。我们假设信息是对的,只是格式有点问题,毕竟信息如果错了肯定没有拯救的必要。

admin@RT-AC3100-88B0:/jffs/scripts# cat phddns.conf 
# 在=后面填写信息, “domain=”一行一个,可自行添加。不要删除本行内容!
user= user 
pass=abcdef 
domain=a.oray.com
domain= b.oray.comdomain =c.oray.comdomain= d.oray.com
admin@RT-AC3100-88B0:/jffs/scripts# 

三、处理用户输入信息

我们先假设用户输入的信息大体是正确的,只是多了空格空行。我们需要读出数据,前文说过可以用cat 抓出文本内容。那么cat出来以后如何处理呢?显然第二行是用户名,第三行是密码,第四行之后是域名,却不知道有几行,shell有很多办法处理这个问题,我们用比较好理解的办法来解决:

cat phddns.conf | awk NR==2
user= user 
cat phddns.conf | awk NR==2 | awk -F"=" '{print $2}'user 
cat phddns.conf | awk NR==2 | awk -F"=" '{print $2}' | tr -d ' '
user

笔者这里一步步演示了处理过程:

  • cat phddns.conf | awk NR==2 前半句大家很熟了就是抓出配置文件的内容,| 管道符表示前面cat得到的结果交给后面的awk来处理。这里的关键是awk NR==2这半句,awk 这个命令用于文本分析很强大,参数较多,全写出来可以水好几章。我们只解释用到的,笔者肯定只写常用的!参数NR==2,表示我们只要第二行!好理解吧?
  • awk -F"=" '{print $2}' 再来看第二个管道符后面的:这里的参数是-F“=”,-F表示切割,-F"="就是以‘=’号切割了嘛,'{print $2}'这部分表示我只要打印切割出来的第2部分,这里还是$引用。
  • tr -d ' ',tr是translate的Linux风格缩写,意为转换,-d表示删除,全句就是删除空格。它不加参数用来转换大小写,替换字符很方便,看下面的例子很容易明白大小写替换:
# A-Z表示从A到Z的26个大写字母,在ASCII表中,B比A大1,所以这个命令只能用于ASCII字符
# ASCII字符读者可以理解成标准键盘能直接输入的字符,中文什么的显然在键盘上找不到
echo "HeLLo WORld" | tr "A-Z" "a-z"
hello world
echo "HeLLo WORld" | tr "o" "O"
HeLLO WORld
  • 顺便一说,估计有读者在嘀咕,几乎全部命令作者你都给出英文单词了,这个awk你是忘记了呢还是不知道呢?这个awk还真不是单词,是作者人名。
  • 这里又学到了|可以连用哦~ 实际只要最后一句,笔者这里是给出了分析过程和每一步的执行结果,读者对照着看就比较容易理解。

第三行我们显然可以用同样的办法得到密码,不过我们换一个命令来处理,多学点嘛:

cat phddns.conf | grep "pass="
pass=abcdef 
cat phddns.conf | grep "pass=" |tr -d ' '
pass=abcdef
cat phddns.conf | grep "pass=" |tr -d ' '|awk -F"=" '{print $2}'
abcdef
  • 因为用户名、密码、域名中是不可能包含空格的,所以我们可以都加上tr -d ' ' 来去除空格。
  • 这里又用了一个grep命令,这个命令主要用于搜索文本,比较简单,一看就明白了,这是在文本中搜索含有“pass=”的行。因为域名中可能含有“pass”却不可能有“=”号,这个“pass=”又是我们事先给出的,我们可以认为用户不会去修改。
  • 最后和上面一样用awk命令以‘=’切割,只要第二部分,第一部分明显是‘pass’。
  • 这里又学习了grep 搜索命令,虽然这个命令在前面用过。

这样我们就得到了用户名和密码,那么不知道有几行的域名怎么办呢?

admin@RT-AC3100-88B0:/jffs/scripts# cat phddns.conf |tr -d ' '
#在=后面填写信息,“domain=”一行一个,可自行添加。不要删除本行内容!
user=user
pass=abcdef
domain=a.oray.com
domain=b.oray.com
domain=c.oray.comdomain=d.oray.com
admin@RT-AC3100-88B0:/jffs/scripts# cat phddns.conf |tr -d ' '| tail +4 
domain=a.oray.com
domain=b.oray.com
domain=c.oray.comdomain=d.oray.com
admin@RT-AC3100-88B0:/jffs/scripts# cat phddns.conf |tr -d ' '| tail +4 | sed -n'/domain/p'
domain=a.oray.com
domain=b.oray.com
domain=c.oray.com
domain=d.oray.com
admin@RT-AC3100-88B0:/jffs/scripts# arr=$(cat phddns.conf |tr -d ' '| tail +4 | sed -n '/domain/p')
admin@RT-AC3100-88B0:/jffs/scripts# echo $arr
domain=a.oray.com domain=b.oray.com domain=c.oray.com domain=d.oray.com

好了,这一部分比较复杂,用到了不少新知识,tr前面用好几次了就不说了:

  • tail +4,tail是英文尾巴的意思,这就好理解了,就是从最尾部到第4行。既然有尾巴肯定有头嘛,所以有另一个命令head 这是从头部起到第几行,一般像这么用:head -4 就是从第一行到第四行。这一头一尾命令就可以组合出任意第几行到第几行了,注意+、-号的区别。
  • sed -n '/domain/p' 这一句才是最麻烦的,和awk一样比较复杂,它很强大很好用,这命令和前面的grepawk 共同组成了shell文本处理三剑客,headtail根本没有存在的必要!sed是流编辑器,s就是stream,流水的意思。这里只解释用到的参数:-n,表示不自动打印,也就是在读取的时候会自动打印一次,最后p也是打印的意思,如果没有-n 会打印两次。/domain/ 表示匹配有domain字符的行,那么整句的意思就是找到带有domain字样的行并打印出来
  • arr=$( ) 最后加了这么一个命令,这里arr是变量,$() 表示切割成数组,数组就是多个同类元素的集合。这又牵扯出一个概念Internal Field Separator,(内部区域分隔符)也就是以什么来分割的问题,默认是以空格,tab制表符,换行符来切割的。在这个命令里就是以换行符‘\n’切割的。这个以后有机会再说吧,路由的数组功能不全的。先暂时有个映像就行了,这章的后面处理用户输入部分很多内容严重超过笔者原定的大纲了,已经超出入门水平所需要学习的知识了。

四、最后完成作品

前面一点一点把每一步都说得比较清楚了,最后就可以写出完整脚本代码:

#!/bin/sh# 这里的$()表示引用括号内的运行结果,至于为什么前面是引用分割,这是shell自动判断的
user=$(cat phddns.conf | awk NR==2 | awk -F"=" '{print $2}' | tr -d ' ')
pass=$(cat phddns.conf | grep "pass" |tr -d ' '|awk -F"=" '{print $2}')
resolve() {
curl -s  "http://$user:$pass@ddns.oray.com/ph/update?hostnam=$1"
}
arr=$(cat phddns.conf |tr -d ' '| tail +4 | sed -n '/domain/p')
for host $arrdoresolve $host# 替换成:echo "http://$user:$pass@ddns.oray.com/ph/update?hostnam=$host"sleep 5done

去路由运行一下看看这个脚本的执行结果,笔者还是把resolve部分换成echo显示

在这里插入图片描述

小结

本章的知识点有点多,难度系数比较高。主要难在文本的处理方面,对于只想入门的读者来说,没必要花太多时间去学会sed命令,数组也只需要略做了解,如果有足够多的人订阅,以后肯定要说明白数组的,shell的数组只有一维,其实很简单的。只要掌握了tailhead 命令以及 awk 的文中所说的两三个用法、grep 搜索的方法,大多数情况能够组合使用得到想要的结果就行了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/596413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言快速入门——基础知识

C语言基础 C语言基础C程序基本格式基本数据类型原码、反码和补码原码反码补码 整数类型浮点类型字符类型 变量变量的使用无符号数类型转换 运算符基本运算符运算符优先级自增自减运算符位运算符逻辑运算符 流程控制分支语句 - if分支语句 - switch循环语句 - for循环语句 - whi…

Ebean:一款被低估的ORM框架

ORM框架为什么不香? 对ORM框架的偏见 看了一些MyBaties与Hibernate进行对比的文章。可能是因为一些Hibernate历史原因,国内对于Hibernate普遍存在偏见,我摘抄了几点: 1. hibernate是全自动,而mybatis是半自动 hibernat…

如何让软文真正起效?媒介盒子为你解答

在如今这个互联网大环境下,想要写出有价值的软文去“忽悠”用户其实是不简单的,那我们应该怎么做才能让软文真正起效呢?媒介盒子为你解答。 一、软文写作前 1.了解平台特性 每个平台都有自己的定位。有的定位于以分享专业知识为主&#xff…

某和医院招采系统web端数据爬取, 逆向js

目标网址:https://zbcg.sznsyy.cn/homeNotice 测试时间: 2024-01-03 1 老规矩,打开Chrome无痕浏览,打开链接,监测网络,通过刷新以及上下翻页可以猜测出数据的请求是通过接口frontPageAnnouncementList获取的,查看返回可以看出来数据大概率是经过aes加密的,如图: 通过查看该请…

014、枚举与模式匹配

枚举类型,通常也被简称为枚举,它允许我们列举所有可能的值来定义一个类型。在本篇文章中,我们首先会定义并使用一个枚举,以向你展示枚举是如何连同数据来一起编码信息的。 接着,我们会讨论一个特别有用的枚举&#xff…

提升设计效率:全面了解如何使用Figma插件

Figma组件库包括颜色、字体、图标、按钮、阴影、圆角、间距等。当Figma组件库的样式和Figma组件达到一定数量时,将难以维护,设计和开发的对接成本将大大提高。Figma可以在同一母版下单独设置样式,而不影响与母版之前的关系,这是Sk…

9.java——(杂例)组合,代理,向上转型static,fianl,关键字(有道云笔记复制粘贴,大家整体性的把握)

组合——内部有类(心中有对象!!!)(足球 和足球运动员梅西和脚下的足球一样) has和is的区别,has是组合,是有,持有的意思;is是继承,是…

C++八股学习心得.3

1.C 数组 C 支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量。所有的数组都是由连续的内存位置组成。最低的地址对应第一个元素,最高的地址对应最后一个…

实时计算大作业kafka+zookeeper+storm+dataV

第一章 总体需求 1.1.课题背景 近年来,大数据称为热门词汇,大数据分析随着互联网技术的发展愈加深入电商营销之 中,越来越多的电商企业利用大数据分析技术,利用信息化对产业发展营销方向进行确定, 对电子商务行…

双碳管理系统任务需求分析(第10套)

需求规格说明书 一、引言 (一)项目背景 编写本需求规格说明书的目的是为了详细呈现碳足迹产品需求和系统的功能描述,以进一步定制应用软件系统开发的细节问题,便于与项目开发协调工作。本文档面向的读者主要是项目委托单位的管…

git rebase(变基)应用场景

文章目录 git rebase(变基)应用场景1.git rebase -i HEAD~3 git rebase(变基)应用场景 使得提交记录变得简洁 现在我们模拟我们有多次提交记录,本地仓库有三条提交 整合成一条提交记录 1.git rebase -i HEAD~3 提交记录合并 HEAD~3合并三条记录 执行之后 然后把…

事实就是这么残酷,分享一个案例投资者是怎么一步步失败

都说交易市场要学会斗智斗勇,但fpmarkets澳福提醒交易者要始终记住,买的没有卖的精,下面就分享一个案例,让各位投资者知道现实就是这么残酷,一些无良的资本是怎么一步步让投资者失败的。 当在整个交易市场中渐渐地&am…

清风数学建模笔记-时间序列分析

内容:时间预测分析 一.时间序列 1.时点时间序列 2.时期时间序列:可相加 二.时间趋势分解 1.季节趋势 拓展:百度指数: 2.循环变动趋势(和季节很像但是是以年为单位) 3.不规则变动趋势(像扰…

《深入理解C++11:C++11新特性解析与应用》笔记八

第八章 融入实际应用 8.1 对齐支持 8.1.1 数据对齐 c可以通过sizeof查询数据的长度,但是没有对对齐方式有关的查询或者设定进行标准化。c11标准定义的alignof函数可以查看数据的对齐方式。 现在的计算机通常会支持许多向量指令,4组8字节的浮点数据&a…

离线Vscode 安装完成后 添加到右键菜单

复制下面代码,修改文件后缀名为:reg Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\*\shell\VSCode] "Open with Code" "Icon""D:\\_Porgram_IT\\VsCode\\Code.exe"[HKEY_CLASSES_ROOT\*\shell\VSCode\comman…

AI:110-基于深度学习的药物分子结构生成与预测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

填充点云孔洞(较大的洞)halcon算法

前言 很多时候,一些小洞可以通过平滑算法,或者三角化算法的参数调整,即可对较小的孔洞进行填充,但是较大的洞却很难通过上面的算法进行填充。 下面介绍一种填充孔洞的思路: 步骤一:对点云进行滤波处理,找到孔洞所在平面 本文为了更直观的进行讲解,去掉了去除噪声和…

数读中国这十年:研发经费超3万亿元 创新引领显成效

摘要:本文转载自新华社。 新华社北京12月22日电 题:研发经费超3万亿元 创新引领显成效 新华社记者 陈炜伟、潘德鑫 这是2023年6月11日在青海省海西蒙古族藏族自治州格尔木市拍摄的一座光热电站(无人机照片)。新华社记者 张宏…

Linux高级玩家必备sos_report-尚文网络xUP楠哥

进Q群11372462领取专属报名福利! # 什么是sos sos 是红帽技术支持工程师在执行任务时的常见起点分析 RHEL 系统的服务请求。 该实用程序提供了一种标准化的方式来收集红帽支持工程师可以在整个调查过程中参考的诊断信息支持案例中报告的问题。 使用 sos 报告实用程序有助于确…

亚马逊站内广告位置在哪设置?怎么设置广告位置?-站斧浏览器

亚马逊站内广告位置在哪设置? 亚马逊提供了多种广告类型,包括: Sponsored Products(赞助产品):在搜索结果和商品详情页中展示。 Sponsored Brands(赞助品牌):在搜索结…