Скрипт telnet для роутера
Надоело выполнять рутинные операции с большим парком железа? Давайте разберем, как автоматизировать процесс подключения по протоколу telnet и ввода команд для удаленной настройки железа, используя скриптовый язык программирования bash.
bash (Bourne again shell, «Born again» shell — «возрождённый» shell) — Самая популярная командная оболочка UNIX/Linux.
Telnet bash script
Первым делом, давайте сформулируем задачу. Допустим, у нас есть три маршрутизатора cisco c ip адресами 192.168.10.10, 192.168.10.11 и 192.168.10.12 и компьютер с Linux. Нам требуется подключиться к каждому маршрутизатору через протокол telnet и узнать версию IOS, используя команду «show ver | include IOS». Можно, конечно, пройтись по этим маршрутизаторам, набирая команды вручную, но когда количество железок вырастет, например, до 100, согласитесь, проделать данную процедуру уже будет довольно утомительно. Поэтому сделаем скрипт, который соберет вывод команд со всех маршрутизаторов в файл.
#!/bin/bash set -x #Входные данные: USER="admin" PASSWD="123456" LOG="telnnet_conn.log" HOSTS=" 192.168.10.10 192.168.10.12 192.168.10.11 " for H in $HOSTS do echo START SCRIPT: >> $LOG date +%x-%R >> $LOG ( sleep 1; echo -en "$USER\r"; sleep 1; echo -en "$PASSWD\r"; sleep 1; echo -en "show ver | include IOS\r"; sleep 1; echo -en "exit\r"; sleep 1; ) | telnet $H >> $LOG echo =================================== >> $LOG done
Описание telnet скрипта
1. Начинаться любой bash-скрипт всегда должен со строки, указывающий путь к bash-интерпритатору.
2. Включаем режим отладки, прописав set -x (позволяет наблюдать за ходом выполнения скрипта в терминале).
3. Задаем входные данные. В нашем случае это имя пользователя (USER), пароль (PASSWD), названия файла, в который будет собираться вывод команд (telnnet_conn.log), и ip адреса, к которым будем подключаться телнетом (HOSTS).
4. Для организации подключения сделаем цикл с перебором ip адресов.
for H in $HOSTS do #Тело цикла (выполняемые операции в цикле) done
5. Для удобства обработки вывода команд добавим строчку начала скрипта, используя echo и дату и время начала выполнения.
echo START SCRIPT: >> $LOG date +%x-%R >> $LOG
6. Теперь начинается основная часть работы скрипта. Укажем команды, которые мы хотели бы, чтобы скрипт вводил за нас, а именно ввод логина, пароля и команду вывода версии IOS. Команда «sleep 1» используется чтобы расставить паузы при выполнение команд.
( sleep 1; echo -en "$USER\r"; sleep 1; echo -en "$PASSWD\r"; sleep 1; echo -en "show ver | include IOS\r"; sleep 1; echo -en "exit\r"; sleep 1; ) | telnet $H >> $LOG
7. Для удобства чтения выведем разделитель (=========), используя echo.
Создать файл можно, используя команду touch имя_файла.
Чтобы не мучиться с правами, можно дать максимум привилегий.
Скрипт отработает и создаст файл с названием telnnet_conn.log, в котором и будет храниться вывод выполняемых на железяках команд.
Пример содержания файла telnet_conn.log
START SCRIPT: 05.11.2017-14:19 Trying 192.168.10.10. Connected to 192.168.10.10. Escape character is '^]'. User Access Verification Username: admin Password: R1>show ver | include IOS Cisco IOS Software, 7200 Software (C7200-ADVIPSERVICESK9-M), Version 15.2(4)S5, RELEASE SOFTWARE (fc1) R1>exit ============================== START SCRIPT: 05.11.2017-14:19 Trying 192.168.10.11. .
На этом все. Нам удалось с помощью написанного скрипта на bash автоматизировать процесс подключения к маршрутизаторам по протоколу telnet, выполнить ввод команд на удаленных хостах и записать результат их выполнения в файл. Комментируем, подписываемся ну и всем пока:)
Скрипт перезагрузки роутера при разрыве коннекта
Дома, как, как и у многих, интернет раздает роутер.
Купленный в свое время ZyXEL P-330W вполне справлялся со своей задачей, пока однажды не начались проблемы. Видимо провайдер что-то там у себя делал, сетка падала, а роутер оставался в полной уверенности, что все в порядке и не переподключал соединение.
Единственное, что оставалось — перегружать сам роутер путем отключения питания.
Т.к. домашний сервак работает 24/7 и интернет ему нужен постоянно, озадачился проблемой автоматической перезагрузки роутера в случае, если отрубается интернет.
ПРОБЛЕМА:
Роутер или ADSL модем теряет связь и не восстанавливает соединение.
РЕШЕНИЕ:
Использование скрипта для проверки подключения к интернет и перезагрузки роутера в случае необходимости.
Как это все будет работать – Раз в полчаса планировщик запускает скрипт, который пингует определенные адреса и если ответа нет, заходит на роутер через телнет и отправляет команду перезагрузки.
Теперь подробно, по шагам.
Создаем в текстовом редакторе файл router.vbs (например)
Копируем туда следующий код:
>>>Начало кода со следующей строки
Function PcOnline (strComputer)
‘Check if the remote machine is online.
Dim objPing,objStatus
Dim TextStream, TimeVar
Dim fso, tf
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Set objPing = GetObject(«winmgmts:»)._
ExecQuery(«select Replysize from Win32_PingStatus where address = ‘» & strComputer & «‘»)
For Each objStatus in objPing
If IsNull(objStatus.ReplySize) Then
PcOnline=False
‘Пишем Лог файл
Set fso = CreateObject(«Scripting.FileSystemObject»)
If (fso.FileExists(«c:\routerlog.txt»)) Then
Set tf = fso.OpenTextFile(«c:\routerlog.txt»,ForAppending, True)
tf.WriteLine(Now() & » » & strComputer & » is down «)
tf.Close()
Set fso = Nothing
Set tf = Nothing
Else
Set tf = fso.CreateTextFile(«c:\routerlog.txt»,ForAppending, True)
tf.WriteLine(Now() & » » & strComputer & » is down «)
tf.Close()
Set fso = Nothing
Set tf = Nothing
End If
‘ Конец Лог файла
Else
PcOnline = True
‘Wscript.Echo strComputer & » is responding to a ping »
End If
Next
Set objPing=Nothing
Set objStatus=Nothing
End Function
Dim fsot, tft
Const ForReading = 1, ForWriting = 2, ForAppending = 8
If PcOnline(«www.ya.ru»)_
OR PcOnline(«www.google.com»)_
Then
‘ если статус = 0, пустая строка — другое
Wscript.Echo «all ok»
Set fsot = CreateObject(«Scripting.FileSystemObject»)
Set tft = fsot.OpenTextFile(«c:\routerlog.txt»,ForAppending, True)
tft.WriteLine(«——————«)
tft.Close()
Set fsot = Nothing
Set tft= Nothing
WScript.Quit 0
Else
‘WScript.Echo «Reboot»
‘Set oShell = WScript.CreateObject(«WScript.Shell»)
‘oShell.Run «telnet.exe 1.1.0.1»
‘WScript.Sleep 2000
‘oShell.SendKeys «user» & chr(13)
‘WScript.Sleep 2000
‘oShell.SendKeys «password» & chr(13)
‘WScript.Sleep 2000
‘oShell.SendKeys «reload» & chr(13)
‘WScript.Sleep 2000
‘oShell.SendKeys «^()q» & chr(13)
‘WScript.Quit 255
End If
Set fsot = CreateObject(«Scripting.FileSystemObject»)
Set tft = fsot.OpenTextFile(«c:\routerlog.txt»,ForAppending, True)
tft.WriteLine(«——————«)
tft.Close()
Set fsot = Nothing
Set tft= Nothing
>>>Конец кода на предыдущей строке
Что к чему:
ya.ru и google.com сервера, которые пингует скрипт для проверки ест ли интернет или нет
user — логин админа роутера или модема – обычно admin
password – пароль админа.
В строчке ‘oShell.Run «telnet.exe 1.1.0.1» вместо 1.1.0.1 прописываем адрес своего роутера (192.168.1.1 например)
В строчке ‘oShell.SendKeys «reload» & chr(13) – reload, это команда, которая перегружает роутер или модем, может отличаться от модели к модели. Посмотрите в документации или методом научного тыка и вставьте ту команду, которая подходит вам – я встречал reload и reboot.
Также скрипт пишет лог файл c:\routerlog.txt
ИСПОЛЬЗОВАНИЕ:
Сохраняем файл router.vbs с кодом внутри.
Добавляем в качестве задания запускать этот файл каждые 30 минут (по желанию)
Для XP — Панель управления -> Назначенные задания -> Добавить задание
Теперь скрипт будет каждые 30 минут проверять соединение с интернет и в случае срыва коннекта перегружать роутер/модем.
Скрипт telnet для роутера
Вы здесь: Главная Статьи Роутеры, модемы, точки доступа Перезагрузка удаленного роутера через Telnet и Cron
Перезагрузка удаленного роутера (модема) с использованием Telnet и Cron в Linux
На объекте заказчика установлен 4G/LTE модем ZYXEL и есть роутер TP-Link TL-WR842N/ND v2. Основная жалоба заказчика на необходимость частой перезагрузки модема и роутера, по причине пропадания интернета, зависания роутера или просто неподключения к wifi сети.
Все действия вы делаете на свой страх и риск. Автор не несет ответственности за возможные последствия
Для исправления ситуации было проделано следующие:
1) Сброшены настройки, обновлены прошивки на модеме и роутере от производителя и заново все настроено — перезагружать стало нужно реже, но проблема осталась.
2) Поиск альтернативных прошивок. Для 4G модема Zyxel не существует, а на TP-Link TL-WR842N/ND v2 была установлена OpenWrt Chaos Calmer 15.05.1 (Рисунок 1). После перехода на альтернативную прошивку проблемы с зависанием и неподключением по wifi более не наблюдаются.
3) 4G модем Zyxel LTE6100, как удалось выяснить, теряет интернет по нескольким причинам:
- а) перестает видеть сим-карту. Замена симки не помогает. Помогает только перезагрузка.
- б) рвет соединение с оператором и потом его не восстанавливает. Помогает только перезагрузка.
- в) просто перестают «ходить пакеты». Помогает только перезагрузка.
К сожалению, альтернативной прошивки не существует, а с офф. сайта проблему не решает. Раз помогает перезагрузка, значит нужно «ребутить», но делать это без участия пользователи и во время когда в интернете нет необходимости.
4) Есть несколько способов делать перезагрузку модема Zyxel LTE6100.
- а) Через WEB интерфейс.
- б) Через Telnet (SSH не поддерживает)
- в) Передергивать питание.
- а) При помощи розетки-таймера.
- б) Написать скрипт, который будет запускаться по расписанию и через Telnet перезагружать модем.
Нами был выбран последний вариант со скриптом, тем более, что роутер Tp-link включен постоянно, а OpenWrt позволяет все это реализовать через Cron.
5) Скрипт выглядит так (Рисунок 2). Данная реализация немного корявая, лучше делать через инструмент Expect, но его нет в базе OpenWrt.
В скрипте вам нужно заменить значения на свои admin, pass, ip_adress
Создаем папку scripts в корне и сохраняем скрипт под названием rebootmodem.sh. Названия папки и скрипта могут быть любыми. Далее нужно перейти на роутере в раздел System-Scheduled Tasks и прописать в Cron (планировщик) параметры запуска (Рисунок 3). Обязательно перезапустите Cron, либо перезагрузите роутер для сохранения параметров запуска.
В нашем случаи запуск скрипта происходит в 4 часа ночи, во вторник, четверг, субботу и воскресение.
После проделанных действий заказчик уже больше 2 месяцев даже близко не подходит к роутеру и модему.
Копирование материалов с сайта разрешено только с согласия автора, либо с указанием адреса источника.
Linux Скрипт перезагрузки роутера по telnet
Всем доброго времени суток.
Тут мелькало много тем по ребуту роутера при потере связи, мало толковых решений.
Вот моё :
простые скрипты на bash для линукс. (Если кому надо для винды — их есть у меня )
код с комментами, читайте — там всё предельно ясно.
первый скрипт обзываем ping и кидаем в /home/$USER
#!/bin/bash #replace '8.8.8.8' with your preferred address to ping. This is a Google DNS server address which you should be able to ping successfully if you are connected to the internet. if ! /bin/ping -c 1 8.8.8.8 then /home/user/restart-router # replace 'user' with your username fi
Второй скрипт обзываем restart-router
это, собственно, сама «функция» чтоб ребутать наш роутер
Тут вам потребуется допилить под себя, потому что у всех роутеров телнет немного отличается. Я выкладываю под среднестатистический ZYXEL LTE (конкретно мой LTE6101)
Вам же нужно будет зайти по телнет на свой роутер и посмотреть, что он у вас спрашивает при входе, и какие строки ввода нужны.
#!/usr/bin/env expect #replace 'admin' with your username set username admin #replace 'password' with your password set pass password #replace 192.168.1.1 with your router's IP address, if it differs set host 192.168.1.1 spawn telnet $ expect -re "router login:" send "$\r" expect "Password:" send "$\r" expect -re "ZySH" #replace 'reboot' with whatever your router's specific command is send "reboot\r" #replace 'logout' with whatever your router's specific command is send "exit\r" expect eof
Далее нам потребуется сделать наши скрипты исполняемыми
chmod +x ping chmod +x restart-router
И в самом конце — добавляем наш ping в cron