简单写个页面来接收远程U盘剩余空间

起因

  之前尝试过用Beaglebone Black开发板来做个低成本的家用小型NAS(见前文),不过使用起来其实终归不是很方便。后来我换了一台刷成OpenWrt的路由器,用一块有一定容量的U盘来挂载在路由器上,作为远程下载的容器,各方面都方便了许多。

  首先路由器本身直接绑定动态域名,也可以直接开放Aria2远程下载的端口,不需要像以前那样还要考虑内网穿透之类的问题。其次内网的各种终端设备(手机、平板、电视机等)直接访问路由器上面的共享盘来播放视频,也无需考虑各个终端自身的防火墙设置之类的。总之,用了一年多下来还是挺不错的。

  这样使用的过程中是没什么问题的,不过每次要远程下载东西都要在心里估摸一下U盘剩余的空间够不够,在剩余空间不够的时候下了超大的东西,造成Aria2远程下载工具结束进程还是小事,之前有一次就这样把一块64G的U盘弄掉固件了,丢数据是不值当的。(虽然U盘群里面的人都建议我不需要用USB3.0的盘来当下载盘,不过短时间内也很难找大容量的USB 2.0普通盘呢)

  所以今天就想解决一下这个问题,至少让我下载东西之前有个页面可以给我看剩余空间就行。

构思

  其实最开始的时候,我想在Aria2的下载客户端上直接添加或者找看有没有后台能显示的地方,结果没什么发现。后来也想过干脆直接把路由器的后台管理LuCI页面直接开放给外网访问,但是出于安全角度考虑还是算了。

  想了半天最终还是考虑让路由器把剩余空间信息传递给外面,在直接通过访问外部的页面来得到数据,这样相对而言对路由器比较安全。把任务分解了一下基本上是下面这些步骤:

  1. 在路由器上获取U盘剩余空间的情况并记录下来。
  2. 将记录下来的数据通过命令直接传递到我网站的服务端上。
  3. 服务端页面接收相应的数据并生成一个静态网页来显示数据。

实现

1、获取U盘剩余空间

  我们知道,OpenWrt实际上是一款基于Linux内核的系统,那么它是可以直接在命令行下使用Linux命令的。那么首先用最常用的 df -h 命令来获得系统剩余空间,得到的结果如下图:

获取系统空间信息

  它把每一个挂载点的剩余空间都列出来了,但是我只需要U盘的那一行,所以再后面加上一个筛选用的命令,即 df -h|grep "mnt",这样就能够得到我想要的那一行信息了。

提取所需行

  接下来为了后续传输方便,把得到的结果输出到一个 txt 文本里面去,最终这里用一行 df -h|grep "mnt">space.txt
命令就可以了,生成了一个记录了上面的信息的 space.txt 文件。

2、服务端编写

  首先还是要先写一个服务端来构建一个接收点,最基本的功能就是接收路由器传递上来的数据流,并且把数据流输出到另外一个静态页面供人读取。因为只是自己用,没有加太多安全性的校验之类的,只做了一个检查Cookie里面的变量值,并且对提交的数据做了一个安全性的转写再输出。具体源代码如下:

PHP服务端代码

  将写好的PHP文件放入到我网站的PHP空间中去,比如地址是 http://candura.us/test.php ,那么提交完数据之后它会在自身目录下生成一个静态页面来显示得到的信息,我平常只要访问 http://candura.us/space.html 就可以看到我想要的U盘剩余空间了。

3、传输数据

  之前喜欢偶尔捣鼓Linux,除了把它作为服务器比较稳定外,自身有很多实用的命令也很关键。所以提交数据这里,我们直接用 curl 命令来实现就好了。最直接的方法就是 curl -d "@space.txt http://candura.us/test.php" 一行命令搞定,不过由于我在服务端当中增加了对Cookie里面的变量校验,所以还需要使用-b参数来带上我设置的密码,另外为了检验输出的情况,再加上一个-v参数来获取返回的整个包的信息。

  所以最终使用的命令是 curl -v -b "验证信息" -d "@space.txt http://candura.us/test.php" ,看到返回信息里面一个大大的 OK,就表示服务端成功接收到了。

数据传输成功

4、设置定时运行

  经过之前的步骤测试成功后,基本上的功能就已经完善得差不多了,接下来是把之前的命令整合到一个批处理里面,让OpenWrt设置它每隔一段时间自动提交上去就可以了。

  Linux的Shell编程其实可以理解为Windows下面的BAT批处理,写起来还是挺简单的,基本上把之前的命令都粘贴上去就完事了,当然为了后续修改方便我还是用了一些变量来设置输出的文件、验证信息、服务端网址等……

Shell代码

  写完之后保存为 space.sh ,然后先手动执行一下看看效果:

Shell执行效果

  成功执行,说明这个批处理写好了,没有什么报错。接下来通过 crontab –e 命令来设置定时运行,在最下方增加上一行定时执行我们这个批处理的代码: * */2 * * * sh /root/space.sh ,里面第二个星号后面加的数字表示每2个小时执行一次。

5、查看结果

  通过这一系列设置好了之后,只要在外网访问我之前PHP服务端生成的那个 space.html 网页文件,就可以看到一行文字。

/dev/sda1 29.6G 22.0G 7.6G 74% /mnt/sda1

  这一行就是记录U盘空间状况的信息了,后续用Aria2来远程下载的时候,提前看一看可以判断还能不能放得下新东西。

后记

  基本上目前已经能够实现我想要的功能了,不过这里面的结果页面除了去除掉多余的空格之外没做什么太多的处理和美化,后续如果要拿这些信息单独提取内容之类的,就简单用个正则表达式匹配一下就行了。下一步打算尝试把这个数据嵌入到我常用的Ariang(一个aria2的网页客户端,感觉比yaaw要好用很多)里面去,这样就更方便了。

文章目录
  1. 1. 起因
  2. 2. 构思
  3. 3. 实现
    1. 3.1. 1、获取U盘剩余空间
    2. 3.2. 2、服务端编写
    3. 3.3. 3、传输数据
    4. 3.4. 4、设置定时运行
    5. 3.5. 5、查看结果
  4. 4. 后记
|