通过 Telnet 实现自动化

大家好!我是大聪明-PLUS

我定期在这里写各种各样的东西,使用 shell 脚本和各种 Linux 实用程序 - 特别是为了再次证明在 Linux 中你不一定需要"找到一个可以执行 XXXXX 的程序" - 在许多情况下,你已经拥有了你需要的一切,你只需要知道如何使用它。

举个例子:

我遇到一个问题:我通过 Keenetic 路由器上网。这些路由器性能很好;它们可以监控多个连接的健康状况,并自动在它们之间切换。

如果通道 A 上的连接断开,我就切换到通道 B。如果连接恢复,我就切换回来。这是一个非常方便的功能。

直到最近,一切都运行正常,就像自动完成一样,我只是从本地聊天中得知 ISP A 的连接失败。

但一段时间以来,ISP B 一直在阻止不必要的连接,并突然引发问题,所以我不得不采取一些安全措施

但要做到这一点,我们需要检测切换。如果路由器没有任何方法通知我们,我们该怎么做呢?

第一个方案是基于流量追踪路由分析。这个方案确实有效,但问题在于,服务提供商自己会改变路由,并且不断追踪与哪些内容相关的信息,这让人感到厌烦。

但是路由器可以识别 Telnet!路由器上有一个 CLI 管理面板,你可以使用各种命令来检查当前连接或执行其他操作。

你只需要编写一个脚本就可以了。

但首先,您需要手动登录:

复制代码
telnet 192.168.1.1
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
Login: XXXXX
Password: ********

THIS SOFTWARE IS A SUBJECT OF KEENETIC LIMITED END-USER LICENCE AGREEMENT. BY USING IT YOU AGREE ON TERMS AND CONDITIONS HEREOF. FOR MORE INFORMATION PLEASE CHECK https://keenetic.com/legal

(config)> show internet status

         enabled: yes
          reliable: yes
gateway-accessible: yes
   dns-accessible: yes
  host-accessible: yes
         internet: yes

          gateway: 
            interface: PPPoE0
              address: 0.0.0.0
             failures: 0
           accessible: yes
             excluded: yes

            hosts: 
                 host: 
                     name: google.com
                 failures: 0
                 resolved: no
               accessible: no

 ....

这里的关键信息是接口:PPPoE0 是通道 A。

通道 B 有其他名称。

剩下的就是写几个脚本了。第一个脚本是get_current_interface,它使用了 expect 程序,其工作原理类似于 PPP 的聊天功能:等待某些字符串,然后输出其他字符串作为响应。

复制代码
#!/usr/bin/expect -f

spawn telnet 192.168.1.1 23
expect "Login:"
send "XXXXXX\r"
expect "Password:"
send "passssss\r"
expect "(config)>"
send "show internet status\r"
expect -re {interface:\s+([^\n\r ]+)}
set log $expect_out(1,string)
set fh [open "/var/log/current_gw" "w"]
puts $fh $log
close $fh

在这种情况下,脚本输入登录名、密码、命令,在第 10 行找到接口名称,在第 11 行将该值分配给日志变量,然后打开文件,将当前值写入其中并退出。

现在 /var/log/current_gw 文件包含了当前接口的名称。

剩下的就是编写一个脚本来查询它:

复制代码
#!/bin/bash

data_file=/var/log/current_gw

old=$(cat $data_file)

get_current_interface > /dev/null
new=$(cat $data_file)

if [ "x$old" != "x$new" ];then
  if [ "x$new" = "xPPPoE0" ];then
  elif [ "x$new" = "xCdcEthernet0" ];then
  fi
fi

现在我们通过 cron 调用它并检查发生了什么变化。如果发生了变化,我们就采取行动;如果没有变化,则无需执行任何操作。

原则上,如果需要的话,同样的方法也可以用来从路由器中提取大量信息。而且不仅仅是从路由器------谁知道呢,还有很多地方需要交互式命令输入......

相关推荐
测试运维日常笔记16 小时前
Unix/Linux 系统软件包管理笔记
linux·笔记·unix
Dr.kangder16 小时前
嵌入式软件测试(十五)——模型检查技术原理与应用
软件测试·测试工具·架构·嵌入式·静态分析
雾时之林16 小时前
Linux--介绍及管理
linux·运维·服务器
盐焗鹌鹑蛋16 小时前
【Linux】重定向
linux
呱呱巨基17 小时前
Docker 基础概念学习
linux·c++·学习·docker
Dlrb121117 小时前
Linux驱动---Linux 中断系统及其上与下半部的介绍与阻塞IO实现按键检测
linux·嵌入式硬件·imx6ull·中断·阻塞io
zhangzhangkeji18 小时前
笔记 22 - 4a :彭老师 15章,uboot 启动,zynq zturn ,uboot 启动参数分析;QSPI 操作
arm
哎呦,帅小伙哦18 小时前
Linux系统中/proc/diskstats文件字段解析
linux
xiaoxiangsiyan18 小时前
企业网络运维自动化与管理协议深度指南
linux·运维·服务器·网络·学习·自动化
我是小灰灰吖18 小时前
Ubuntu22.04,OpenCV 4.5.5 环境搭建
linux·qt·ubuntu