Я тут периодически пишу про всякие штуки, с использованием shell-скриптов и разных linux-утилит - в частности, чтобы лишний раз продемонстировать, что в линуксе не обязательно требуется "найти программу которая умеет делать ХХХХХ" - во многих случаях у вас уже есть всё необходимое, нужно только знать как использовать.

Вот, например, такая задача. У меня выход в интернет через роутер Keenetic. Роутеры эти неплохие, умеют, в частности, вести контроль работоспособности нескольких подключений, автоматически переключаться между ними.

Отвалилось соединение по каналу А - переходим на канал Б. Восстановилось - переходим обратно. Очень удобная функция.

До недавнего времени работало идеально, в том смысле что всё происходило само собой, и об обрыве канала А я узнавал только из воплей в местном чате.
Но с некоторого времени провайдер Б начал блокировать что не надо, и создавать проблемы на ровном месте, а поэтому потребовалось принимать некоторые меры безопасности.

Но для этого надо отлавливать факт переключения. И как это сделать, если роутер не умеет об этом как-либо оповещать?

Первый вариант был на основе анализа маршрута трассировки трафика. Схема рабочая, но проблема в том, что сами провайдеры меняют свои маршруты, и постоянно поддерживать актуальность, что к чему относится, порядком надоело.

Но роутер понимает 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

 ....

Ключевая информация тут interface: PPPoE0 - это и есть канал А.
Канал Б называется по-другому.

Оставалось написать пару скриптов. Первый из них, get_current_interface, - использует программу expect, которая работать примерно как chat для 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 присваивает это значение переменной log, потом открывает файл, записывает в него текущее значение и завершает работу.

Теперь в файле /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
      # что-то делаем полезное 1
  elif [ "x$new" = "xCdcEthernet0" ];then
      # что-то делаем полезное 2
  fi
fi

Теперь вызываем его по крону, и проверяем, что изменилось. Если изменилось — принимаем меры, если нет — ничего делать не надо.

В принципе по той же схеме можно много чего из роутера извлечь, если потребуется. И не только из него — мало ли, где требуется интерактивное взаимодействие со вводом команд...

Комментарии (20)


  1. mc2
    28.09.2025 02:38

    keencli(есть на гитхабе в разных вариантах) попробуйте этот вариант так же. Данный скрипт работает через http api с роутером.


  1. vmcore
    28.09.2025 02:38

    на кинетиках с достаточным объемом флэш-памяти есть возможность установить opkg и запускать скрипты хоть на питоне


  1. ugenk
    28.09.2025 02:38

    (Del)


  1. AVX
    28.09.2025 02:38

    Где-то в 2008м делал скрипт, который (через curl, кажется) лазил на веб-интерфейс роутера, проверял состояние подключений, и тыкал нужную кнопку, если что-то упало. Вполне нормально работало.


  1. max9
    28.09.2025 02:38

    но зачем. там же ссш есть


    1. JBFW Автор
      28.09.2025 02:38

      Нет там ссш. Только telnet, dns и http.

      Конкретно в этом нет. В других моделях возможно, но и речь в общем-то о способе достучаться туда где нет.

      Так-то бывают роутеры с SNMP, там вообще по другому можно...


      1. max9
        28.09.2025 02:38

        хм. а это тогда кто?


        1. JBFW Автор
          28.09.2025 02:38

          А у меня нет )


          1. Vilos
            28.09.2025 02:38

            полагаю вам бы прошивку обновить стоит, тогда и ssh появится.

            в целом решение неплохое, плюсую...несмотря на то что это всё-таки некий "костыль"; правильней через SNMP or SSH


  1. andrewdeath
    28.09.2025 02:38

    Давно хотел через роутер узнавать кто дома. Поставил entware, далее nginx с php. php скрипт, лезет в админку, получает список устройств в сети и тем самым если телефон человека в сети, значит этот человек дома.


    1. pMalice
      28.09.2025 02:38

      У Keenetic есть софт - Netcraze, позволяет все это делать, смотреть активных, получать уведомления при подключениях, отключать/включать, менять политику доступа для клиента и т.д.


      1. JBFW Автор
        28.09.2025 02:38

        Так концепция была "как сделать", а не просто "использовать чье-то" )

        И тут не только субьективное "изобретение велосипеда" - но и обьективная реальность:

        Одно время довольно распространено было, что провайдеры покупали дешевые ноунейм-роутеры в Китае, накатывали на них прошивку того же Кинетика и продавали клиентам.
        Оно работает - кроме работы с кинетиковым облаком (вроде как потому что там уникальный серийный номер устройства не бьется).

        Ну и санкции сейчас, с одной стороны - блокировки с другой...


      1. andrewdeath
        28.09.2025 02:38

        Там же нужно авторизовываться. И если такую фичу дать попользовать ещё кому то в семье на его телефон, то ему нужно или логин пароль сказать или даже отдельного пользователя на роутере завести... Слишком сложно. Так сделал ярлык на ip:port прям на экране, сказал, тыкай сюда и видишь кто дома сейчас! Да и верно подметили тут, самому интереснее сделать!


    1. ASaasssaas
      28.09.2025 02:38

      Вот же делать то нечего!

      Большинство этих так называемых скриптов и пишет вот такие, которым или делать нечего или оптимизируют работу 2х секундную. В следующий раз пишите скрипты, сколько раз вышел сосед и сколько раз открылся мусоропровод.


      1. JBFW Автор
        28.09.2025 02:38

        Так-то неплохой элемент системы "умного дома": если в доме 1-2-3 человека - могут быть задействованы разные сценарии. Для кого-то это может быть полезно.
        А определять наличие конкретных людей по их телефонам - почему бы и нет?


    1. Vilos
      28.09.2025 02:38

      как определяется "..список устройств в сети"? По выданному ip? По arp таблице? и то и другое имеет свои "нюансы", которые могут немного "привирать". Например если смотреть на выданные Ip в DHCP, то тогда нужно ставить Лизу короткую обычно она сутки...чем короче лиза, тем точнее определить наличие устройства, но тогда увеличиваем служебный трафик по перезапросу адреса от DHCP.


      1. JBFW Автор
        28.09.2025 02:38

        Эти роутеры умеют выдавать список устройств в сети, и их текущий статус, онлайн или нет. То есть просто тупо список.

        Это действительно можно использовать


      1. nixtonixto
        28.09.2025 02:38

        Конкретно Keenetic пишет модель аппарата в списке устройств. Поэтому, увидев, что условный сяоми определённой версии в сети - можно понять, кто именно дома. Если точно таким же аппаратом больше никто в семье не пользуется.


  1. unreal_undead2
    28.09.2025 02:38

    А почему именно telnet а не nc?


    1. JBFW Автор
      28.09.2025 02:38

      Тогда это называлось бы "автоматизация с помощью nc" )
      Так тоже можно, просто telnet стандартная утилита, а nc уже продвинутая...