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

专栏导航

序言及专栏目录

第一章 简单编程实现花生壳的ddns功能

第二章 如何让花生壳ddns脚本自动工作 ⇐

第三章 同时解析多个花生壳域名的脚本

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


第二章 让花生壳ddns脚本自动工作

文章目录

  • 专栏导航
    • 第二章 让花生壳ddns脚本自动工作
    • 前言
    • 一、如何让脚本手动工作
    • 二、怎么让它自动运行
    • 三、更好的办法
    • 小结


前言

显然本专栏的文章与作者以前的风格不同,这个专栏是以让读者看明白为目的写的,不像以前只是简单记录重点,作者或有相关经验的人才能看明白。如果对您有一定帮助,希望读者能订阅,以鼓励作者创作更多更好的文章。

前面第一章我们学习了几个命令,主要是 curlwgetscpsshchmod 。还写好了一个脚本,并将其上传到路由。本章我们就来让这个脚本自动工作,主要是在梅林固件上演示,因为这个固件最麻烦。padavan 和 openwrt 都有图形接口,可以直接编辑,梅林得自己写代码实现。


一、如何让脚本手动工作

在脚本自动工作之前,我们要先手动运行一下。要是手动都不能达到设计目的,就算设置成自动也是无意义的。同样先用ssh连上路由器:

mac@macdeAir ~ % ssh [email protected]
# 登陆成功后
admin@RT-AC3100-88B0:/tmp/home/root#
# cd 到文件目录
admin@RT-AC3100-88B0:/tmp/home/root# cd /jffs/scripts/
# 注意路径改变了,我们已进入脚本所在目录
admin@RT-AC3100-88B0:/jffs/scripts# 

这里虽然只是执行了小小的一个 cd 命令,但是很有讲究的,admin是登陆的用户名,RT-AC3100-88B0是机器名,中间的@是不是和上一章的用户名:密码@服务器地址很像?这种写法在网络传输中很常见,比如git也是这样的。

后面的# 号,在Linux中表示这是root超级用户,具有最高权限。路由器登陆就是root,正常的linux 登陆后多半是 $ 符表示普通用户。路由器在用户和组管理方面被精简了。/tmp/home/root 登陆初始的位置,这个位置是写在 /etc/paawd文件中的,这个文件还记录了用户所属组、用户编号(UID)、用户组号(GID)、初始登陆目录、执行的shell,我们可以用个命令查看一下

cat /etc/passwd
admin@RT-AC3100-88B0:/tmp/home/root# cat /etc/passwd
admin:x:0:0:admin:/root:/bin/sh
nas:x:100:100:nas:/dev/null:/dev/null
nobody:x:65534:65534:nobody:/dev/null:/dev/null
tor:x:65533:65533:tor:/dev/null:/dev/null
admin:x:500:500:::

除了第一行是root,一般root的UID和GID都是0,就是我们登陆的用户。其它的几个都是固件自带的用户,当然这些都不是真正存在用户,只是系统工作所生成的伪用户,某些程序会用到。

这里又学习了两个命令,cd 和windows一样用于切换目录,是change dir的意思。要去哪个目录,直接 cd 过去就是了,很简单很常用,cat 是catch的意思,抓住。所以这个命令可以把一个文件里的内容抓出来。它也可以用来抓非文本文件,只是抓出来很多问号乱码什么的~ 这个命令很常用,路由折腾界中,它还常常用来备份分区:

cat /dev/mtdblock0 > cfe
# /dev 这个文件夹里都是硬件相关的,mtdblock0就是cfe分区,某些固件只写这个分区,所以也叫cfe固件。
# 这命令就是把mtdblock0抓到cfe文件里,cfe是自己取的名字,你叫它boot也行,a.img也没问题,自己知道就好

反正啥都能被它抓住。不歪楼了,咱还是先执行一下phddns脚本:

admin@RT-AC3100-88B0:/jffs/scripts# ./phddns
# 以后的代码演示中没有必要将不会再写出路径提示符

这样就可以了,./ 表示本级目录下,phddns这个文件前一章已经给了x权限,所以可以直接执行,这个./ 是不能省的,linux默认会去环境变量设置的路径去找可执行程序,文件所在的目录没有被添加到环境变量里,所以要告诉系统就在这里找!直接输入:

export -p

就可以查看到有一行export PATH=‘/bin:/sbin…’, 这一行就是默认可执行程序的查找路径。里面还有其它很多信息,用到再说吧。这样我们就手动运行了这个脚本一次,可以看到效果了。具体执行结果和前一章的单独命令也没差别,就不再演示了。

二、怎么让它自动运行

我们这里的自动运行是指每隔几分钟运行一下,让脚本去ddns服务器替我们修改域名的解析为我们路由的当前ip。在windows的控制面板中有一个计划任务可以做这类工作,Linux中当然也有类似的工具,可以叫定时任务,任务名称是crond,我们一般称作cron。通常末尾带d的长得又怪的(指看起来不像一个单词),表示守护任务,字母d就是Daemon的意思(这是个神名,希腊神话中的守护神)

在padavan、openwrt中图形界面下就有定时任务可以添加,而梅林就比较麻烦了,梅林并没有友好的图形接口让我们直接添加计划任务,而且梅林中的 crontab -e 命令可以运行,可是重启就丢失配置了。虽然确实存在 crond 这个守护进程 1 但是它生成的文件放在了 /tmp下的某一个文件夹里,这个目录重启会被清空!在梅林中实际目录如下:费了我好大的劲才给它找出来…

cat /tmp/var/spool/cron/crontabs/admin
# cat 出来看一下,笔者这里只列出一条来讲解
0 */12 * * * /bin/sh /koolshare/scripts/config-frps.sh #frps_monitor#

这是一条frps的定时任务,它的意思是每天的12点和24点用 /bin/sh 解释器运行一下/koolshare/scripts/ 路径下的config-frps.sh程序脚本。最后的 #frps_monitor# 是注释,我们解释一下这行代码的逻辑:

  • 第一个0,表示在时钟的分为0的时候运行,取值范围:0-59
  • 第二个*/12,表示时钟的时能被12整除时运行,结合上一个0,可以看出这是12点和0点(也叫24点,0也能整除)。取值为0-23
  • 第三个*,表示任一天,1-31
  • 第四个*,表示每个月,1-12
  • 第五个*,表示一周的每一天,1-7代表周一到周日,也可以是0-6(0是周日),两种写法都能用。
    以上的五个位置分别表示了:分、时、日、月、周几
    组合起来后,可以定时到任一天的任一分钟。假设我们想要每五分钟运行一下这个phddns脚本,可以这样写:
*/5 * * * * /jffs/scripts/phddns

读者稍微思考下也就明白这个写法了吧~ 但是怎么写文件呢?这里可没有记事本这样的东西,下面介绍两种写文件的方法:

# 可以用echo命令
echo "*/5 * * * * /jffs/scripts/phddns" >> /tmp/var/spool/cron/crontabs/admin

echo 是回声的意思,在linux中一般称为回显命令,它通常的的工作是把字符输出到屏幕上。一般我们要想在屏幕上显示什么就可以用它,比如经典的hello world:

echo 'hello world'

>> 这个符号在这里表示追加,把 “*/5 * * * * /jffs/scripts/phddns” 追加到原有文件最后的下一行。如果用 > 会清空原有内容再写入。cat 命令也是同理,参考一下上述备份cfe的命令。这样就把定时任务给添加好了。

但是前面说过了,这个文件存在于 /tmp 目录下,它是每次重启会被清空的!清空后系统又会创建新的文件,但系统不会管你自己写的内容。那么怎么办?聪明的你肯定想到了,我们再写一个脚本,让新脚本开机就给cron 添加这一行任务不就行了嘛~ 而且这个新的脚本还可以用梅林界面中的 tools–>script 中的功能,设置wan-start,让它开机联网就执行2。虽然折腾了点,但应该可行。那么有没有更好的办法呢?显然的,我们程序猿们都是直接去/jffs/script/wan-start中添加这一行echo命令

cd /jffs/script
vi wan-start

vi 是一个文本编辑工具,初次上手好可能很不好用,它有两种状态,刚进入是命令状态,你是不能输入文字的,这种状态用于输入命令,比如:

  • :w 就是保存命令,注意有:号(几乎所有编程语言只认英文字符命令,不敢说全部)
  • :q 就是退出
  • :wq 就是保存后退出
  • q! 强制退出,当你改变内容后又不想保存就用得上了

如果要输入得先敲一次 i 键,表示进入插入文本状态,在这个状态下移动光标到最后,再回车换新行,输入echo "*/5 * * * * /jffs/scripts/phddns" >> /tmp/var/spool/cron/crontabs/admin" 然后按 esc 键退出插入状态,再用:wq 命令保存退出(大胆的直接打:wq,别怕!估计看这专栏的没一个没刷过机,又不会爆炸)。说半天,搞明白了还是可以用的,某些专业人士经常说它好用,笔者是不认同的,倒也不是操作的问题,主要是这玩意会拖出残影!实际功能还是比较强的,比win的记事本强些!不过 vi 命令有个兄弟叫 vim ,就比较好用了。可惜梅林固件不带这个,想用得另外安装。这里只介绍最简单的操作,用多了你自然会想着怎么搜索,怎么定位的问题,网上多的是教程。

三、更好的办法

上一节纯粹是为了折腾让读者多学几个命令写的,实际上用echo 命令来添加也不是正经的办法!只是个可行的办法,而且很可能会出问题!因为wan-start这个脚本是在wan口启动(正经叫up)就执行一次的,而wan口可不一定只在开机的时候up一次,你改变了某些参数提交的时候它就会工作一次!其它firewall-start等脚本也一样。所以很可能会在cron中冒出多条一样的定时任务!

那么正经应该怎么办?梅林固件提供了一个命令cru 用来管理定时任务,这个命令只有三个参数a 表示增加一个计划、d 表示删除一个计划、l用来列出所有任务。
可以这样来写:

cru a phddns "*/5 * * * * /jffs/scripts/phddns  /tmp/var/spool/cron/crontabs/admin"

这只是改变了添加任务的方式,好处是这条命令写到wan-start中,是不会产生echo 命令那种可能写多次的情况,它不能添加同样的任务两次。
细心的读者应该发现了,为什么cru这三个字是白色的?其它命令在作者的Markdown里都是彩色的啊,这是因为这个 cru 命令并不是Linux的标准命令,很可能是梅林路由器独有的。所以shell语法识别不出它来,这个命令的介绍就简单点:删除、打印任务清单这样写

# 删除,显然这个phddns就是上面跟在a 后面的那个,这相当于给任务起名
# 实际在cron里它就是注释,这么写是为了做标记,容易被找出来
cru d phddns
# 打印任务
cru l

对于openwrt 和padavan,系统都提供了定时任务界面,直接去相应界面上写就是了,也是遵守上述Linux的cron任务的写法规则的。梅林呢没有这样的界面提供,所以我们直接在wan-start脚本中加一行cru命令来添加定时任务,这就是我们的编程思考逻辑。

这样脚本就应该能比较正常的工作了,这个最简单的脚本算是完成了,虽然说是最简单的,但稍作变通,它可以应用在几乎大半的免费二级子域名ddns中,比如:

# freedns 的更新命令
wget http://v6.sync.afraid.org/u/这一串字符是token/
# dynv6的ipv6 这是写了个auto 用了&而已  前面说过
curl https://ipv6.dynv6.com/api/update?ipv6=auto&token=我是token
# 还有很多,不一一举例

结合官网的更新命令,读者阅读完这两章应该能写出这种最简单的ddns来解决问题了吧?


小结

用了两章把这个最简单的ddns命令给讲完了,进度还是略快了点。没有命令行使用基础的读者可能接受起来会有点困难。笔者会在基础篇中补充常用命令和参数。英文有基础的读者可以直接看帮助,绝大多数linux命令你加上参数 --help 或 -h 、-H 之类都有说明。正经linux还有 man (不是男人,是manual)命令可以在线看操作手册。所以讲解命令的篇幅不会太多,那么下一章开始咱提高点档次,把命令行交互式编程换成正经程序脚本。这样就有很大的实用性了!

返回专栏目录 <<<


  1. 可以用 ps 命令看到 crond的存在
    ps |grep crond
    812 admin 1464 S crond
    17297 admin 1452 S grep crond
    ps 是用于查看系统有多少进程在运行的,类似于win的任务管理器,p应该是英文Process (进程),s应该是Status(状态),后面的| 是管道符,表示把前面的结果送给后面的命令处理,grep命令应该是:(global search regular expression and print )全局搜索正则匹配打印,正则先不说,就是在前面ps生成的结果中找到含有 crond 的行(注意这个行hang字)并显示出来。812 是进程号,下面一行是我们正在运行的搜索命令,因为搜索crond,自然也有crond这个字符串,也被找出来了。 ↩︎

  2. 应该不能直接把echo这个命令写到script这个功能中的,虽然笔者没有试过,因为折腾这个script功能还更废事,不如直接去改文件。 ↩︎

你可能感兴趣的:(linux,智能路由器,网络,ddns,shell)