Ping check перезагрузка роутера
Как оказалось, в гигабитном роутере TP-LINK TL-WR1042ND нет управления при помощи консоли. Но роутеры, как известно, иногда виснут. Точнее, сам роутер продолжает работать и откликаться на команды управления из админки и VPN показывает, что он подключен, но интернет при этом не доступен. Иногда это происходит по вине самого устройства, иногда проблемы со стороны провайдера, и перезагрузка часто решает проблему. При чем, желательно, чтобы это происходило автоматически. Поэтому было принято решение перегружать роутер при помощи HTTP GET запроса…
После непродолжительного исследования были найдены такие команды:
Разорвать VPN соединение:
http://login:pass@192.168.0.1/userRpm/StatusRpm.htm?Disconnect=Disconnect&wan=1
Подключить VPN:
http://login:pass@192.168.0.1/userRpm/StatusRpm.htm?Connect=Connect&wan=1
Перезагрузить роутер:
http://login:pass@192.168.0.1/userRpm/SysRebootRpm.htm?Reboot=1
Но, как оказалось, управлять этими командами роутером напрямую не получается. Они работают только при авторизации в админке роутера через браузер и то только можно увидеть их выполнение с помощью firebug, а напрямую, при вводе в адресную строку работает только команды дисконнекта/коннекта VPN. Команды срабатывают, но при этом все равно выдается ошибка. Перезагрузить роутер таким образом не получается.
Мгновенно выскакивает “You have no authority to access this router!” и ничего не происходит.
http://login:pass@192.168.0.1/userRpm/StatusRpm.htm?Disconnect=Disconnect&wan=1
выдает ту же ошибку, но с некоторой задержкой, а запрос выполняется – т.е. wan отключается.
При этом в админку входит по ссылке с прописанной авторизацией: http://login:pass@192.168.0.1 и управление из админки дальше работает!
Перезагрузка из Linux
Меня больше интересовала перезагрузка из линукса, но такая команда не срабатывала:
wget --http-user=login --http-password=pass --post-data="reboot=true" http://192.168.0.1/userRpm/SysRebootRpm.htm
Connecting to 192.168.0.1:80. connected. HTTP request sent, awaiting response. 401 N/A Reusing existing connection to 192.168.0.1:80. HTTP request sent, awaiting response. 200 No headers, assuming HTTP/0.9 Length: unspecified Saving to: `SysRebootRpm.htm'
К тому же, при помощи wget не удавалось даже выполнить Disconnect/Connect VPN.
На русском форуме TP-LINK была открыта тема, но в результате обсуждения, решения найти не удалось.
Английская техподдержка на запрос “How i can reboot my device by bash script?”
ответила следующее: “this is not possible to reboot devices in a such way”.
Ticket#2013101610000131
Решение все же было найдено. Не вдаваясь в подробности скажу что роутер при GET запросе проверяет:
- Http basic авторизацию.
- User-Agent браузера.
- Корректное поле рефер, которое всегда будет просто http://IP адресом роутера, т.к. роутер использует редиректы.
Cookie для авторизации не используются.
С этим всем отлично справляется команда curl.
Скрипт перезагрузки роутера
Итак, привожу скрипт перезагрузки роутера, который у меня получился:
#!/bin/sh WATCHED_IP="8.8.8.8" ROUTER_IP="192.168.0.1" USERNAME="login" PASSWORD="pass" # watch for remote host ping -q -c 1 "$WATCHED_IP" > /dev/null && exit # exit if router is down ping -q -c 1 "$ROUTER_IP" > /dev/null || exit curl --basic --user "$USERNAME:$PASSWORD" -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" --refer "http://$ROUTER_IP" "$ROUTER_IP/userRpm/SysRebootRpm.htm?Reboot=reboot"
Соответственно, скрипт реконнекта VPN:
#!/bin/sh WATCHED_IP="8.8.8.8" ROUTER_IP="192.168.0.1" USERNAME="login" PASSWORD="pass" # watch for remote host ping -q -c 1 "$WATCHED_IP" > /dev/null && exit # exit if router is down ping -q -c 1 "$ROUTER_IP" > /dev/null || exit curl --basic --user "$USERNAME:$PASSWORD" -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" --refer "http://$ROUTER_IP" "$ROUTER_IP/userRpm/StatusRpm.htm?Disconnect=Disconnect&wan=1" #sleep 1 curl --basic --user "$USERNAME:$PASSWORD" -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" --refer "http://$ROUTER_IP" "$ROUTER_IP/userRpm/StatusRpm.htm?Connect=Connect&wan=1"
Поставил в cron скрипт реконнекта при отсутствии пинга dns гугля – проверка каждые 3 минуты.
Скрипт перезагрузки проверяет наличие интернета каждые 15 минут.
login:pass, конечно, нужно будет поставить свои. Файлы скриптов назвать, например, tplink_reboot.sh и tplink_reconnect.sh, сохранить на сервере, дать права на выполнение и добавить в планировщик.
Уже пару раз выручило:
tplink_reconnect.zip
tplink_reboot.zip
PS:
на форуме https://forum.tp-linkru.ru Scorokhod поделился своим вариантом перезагрузки роутера при помощи WGET, за что ему огромное спасибо:
wget --http-user=%login% --http-password=%password% --user-agent="Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36" --referer=http://%router_ip%/userRpm/SysRebootRpm.htm http://%router_ip%/userRpm/SysRebootRpm.htm?Reboot=1
Вместо “login”, “password” и “router_ip” подставить соответственно логин, пароль и IP маршрутизатора без кавычек и процентов 🙂
WGET для Windows можно взять здесь: http://gnuwin32.sourceforge.net/packages/wget.htm, качать нужно “Complete package, except sources – Setup”.
Перезагрузка из Windows
Готовая сборка Wget + Bat скрипт для перезагрузки (только перегружает):
скачать tplink_reboot_wget.zip (подходит для большинства моделей Tplink, не только WR1042ND)
Перезагрузка из Android
(спасибо за этот код neolead)
Для андроид в данном изложении требуется root. Если нет рута.. то в конце checknet заменить на step1
Установить Busybox https://play.google.com/store/apps/deta … on.busybox
и Android Terminal emulator https://play.google.com/store/apps/deta … ndroidterm
–to do list
Перемонтировать/system на запись “su -c mount rw,remount /system”
Поместить допустим в /system/script,”su -c chmod 0777 /system/script/”
Дать скрипту права на исполнение “su -c chmod 0755 /system/script/ping2.sh”
Добавить в автозапуск в настройках терминала.
у меня работает в машине как переподключение,затем перезагрузка wifi после трёх фейлов…
-----ping2.sh #!/system/bin/sh pingip=8.8.8.8 login=admin #Username password=admin #Password router_ip=192.168.0.1 #Ip of router sleep_time=30 #Time to next check sleep_rbt_time=70 #Time to waiting of reboot f1=10 #First pause in sec f2=30 #Second pause in sec increment=0 b64_auth=$(echo $login:$password | base64|rev|cut -c 2-|rev) network=toyota #SSID name of wifi while true do function checknet() < ssid=0 while [ "$ssid" != "$network" ] do ssid=$(su -c dumpsys wifi|grep "* ID:"|cut -f 2 -d \") echo ssid=$ssid echo network=$network if [ "$ssid" = "$network" ]; then echo "Correct Wifi Network" else echo "False Wifi Network,press Enter key" read -rs fi done >function slp() < increment=0 echo "will sleep $sleep_time sec" sleep $sleep_time #check again >function wifi_conn() < echo modem reconnect printf "GET /userRpm/StatusRpm.htm?Disconnect=Disconnect&wan=1 HTTP/1.0\r\nReferer: http://$router_ip/userRpm/StatusRpm.htm\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.1.1650.63 Safari/537.36\r\nAccept: */*\r\nHost: $router_ip\r\nConnection: Keep-Alive\r\nAuthorization: Basic $b64_auth=\r\n\r\n"|nc -w 5 -i 1 $router_ip 80 >/dev/nul printf "GET /userRpm/StatusRpm.htm?Connect=Connect&wan=1 HTTP/1.0\r\nReferer: http://$router_ip/userRpm/StatusRpm.htm\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.1.1650.63 Safari/537.36\r\nAccept: */*\r\nHost: $router_ip\r\nConnection: Keep-Alive\r\nAuthorization: Basic $b64_auth=\r\n\r\n"|nc -w 5 -i 1 $router_ip 80 >/dev/nul > function wifi_rst() < #echo LOGIN:$b64_auth= increment=$(( $increment +1 )) echo Reboot Times=$increment if [ "$increment" -eq 3 ]; then echo "We Already Reboot = $increment times" echo "We Stop Rebooting" read -rs $'Press any key to continue monitoring. \n' -n1 key else printf "GET /userRpm/SysRebootRpm.htm?Reboot=1 HTTP/1.0\r\nReferer: http://$router_ip/userRpm/SysRebootRpm.htm\r\nUser-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.1.1650.63 Safari/537.36\r\nAccept: */*\r\nHost: $router_ip\r\nConnection: Keep-Alive\r\nAuthorization: Basic $b64_auth=\r\n\r\n"|nc -w 5 -i 1 $router_ip 80 >/dev/nul echo "Now reboot request was send,will sleep $sleep_rbt_time sec" sleep $sleep_rbt_time fi > checknet if ping -c 1 $pingip >/dev/null then echo "all good step 1" slp else if ping -c 1 $router_ip >/dev/null then echo Router is pinging - channel is down else echo Router is down - channel is down increment = 3 wifi_rst fi echo Bad Ass step 1 - will wait $f1 sec! sleep $f1 #give it a few seconds to complete fi if ping -c 1 $pingip >/dev/null then echo "all good step 2" slp else echo Bad Ass step 2 - will wait $f2 sec! sleep $f2 #give it a few seconds to complete fi if ping -c 1 $pingip >/dev/null then echo "all good step 3 " slp else wifi_conn echo Bad Ass step 3 - Reconnect! wifi_conn fi if ping -c 1 $pingip >/dev/null then echo "all good step 4 " slp else echo Bad Ass step 3 - Reconnect! wifi_rst fi done
Скетч Arduino для плат на базе микроконтроллера ESP32
(спасибо за этот код p-a-h-a)
#include #include const char* IP_port = "http:// 192. 168. 0.1:80"; // Убрать пробелы, заменить на свой адрес #define RouterLogin "admin" #define RouterPassword "admin" void setup() < Serial.begin(115200); WiFi.begin("ssid", "pass"); while (WiFi.status() != WL_CONNECTED) < delay(500); Serial.print("."); >HTTPClient http; http.begin(String(IP_port) + "/userRpm/SysRebootRpm.htm?Reboot=1"); http.setAuthorization(RouterLogin, RouterPassword); http.addHeader("User-Agent","ESP32 wrower"); http.addHeader("Referer", String(IP_port) + "/userRpm/SysRebootRpm.htm"); Serial.printf("[HTTP] GET. code: %d\n", http.GET()); // Serial.println(http.getString()); // Выдаст вебстраничку ответа http.end(); > void loop() <>
Ping check перезагрузка роутера
Если у вас не работает один из способов авторизации, сконвертируйте свой аккаунт по ссылке
Авторизуясь в LiveJournal с помощью стороннего сервиса вы принимаете условия Пользовательского соглашения LiveJournal
Скрипт перезагрузки ADSL модема при потере связи Команда перезагрузки роутера
Долго мучался, ибо мой роутер ZyXEL P-330W иногда вырубал сеть (PPPoE). Оказалось была включена опция «поддерживать подключение», переставил на «подключение по запросу» — выправилось. Потом видимо пров как-то хитро ресетил сервер, что роутер не понимал, что соединение потеряно и делал вид, что все Ок, а на самом деле инета не было. Начал искать, как ресетить роутер программно, а не выдергивать его каждый раз из сети. Нарывался на форумы, где народ задавал такой же вопрос и на 5 страниц потом остальные удивлялись на хрена это нужно и предлагали выключатель припаять в разрыв цепи питания роутера. Удивляюсь на таких людей, не знаешь — так помолчи, за умного сойдешь. Причем это на форумах ixbt и ru-board.
Копался, копался — нашел. Один хороший товарищ поделился скриптом перезагрузки роутера в случае отсутствия инета. Как всегда, все гениальное просто. Ресетится роутер через телнет командой Reset или Reboot или Reload- от модели зависит, а скриптик дан ниже. К сожалению на форумах одинаковое сообщение от разных авторов, поэтому автора тяжело определить, но все равно БОЛЬШОЕ ЕМУ ЧЕЛОВЕЧЕСКОЕ СПАСИБО.
Итак, проблема: ADSL-модем иногда (то реже раза в неделю, то несколько раз в сутки) теряет коннект так, что не может его переподнять самостоятельно. В моем случае — модем D-Link, у Томпсон, судя по отзывам эксплуатирующих, проблема не менее редкая.
Что меня расстраивало, т.к. иногда не мог при необходимости зайти с работы на домашний комп, или поставленные на день закачки не докачивались к вечеру из за того, что связь обрывалась утром.
Итак, модем настроен в режиме роутера, раз в пол-часа планировщик запускает скрипт, проверяющий успешное прохождение pingов до указанного сервера, при непрохождении — заходит на роутер через telnet и отправляет команду перезагрузки.
Собственно, скрипт (modem.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:\testfile.txt»)) Then
Set tf = fso.OpenTextFile(«c:\testfile.txt»,ForAp pending, True)
tf.WriteLine(Now() & » » & strComputer & » is down «)
tf.Close()
Set fso = Nothing
Set tf = Nothing
Else
Set tf = fso.CreateTextFile(«c:\testfile.txt»,For Appending, 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
Dim fsot, tft
Const ForReading = 1, ForWriting = 2, ForAppending = 8
If PcOnline(«www.ya.ru»)_
OR PcOnline(«www.inetcom.ru»)_
Then
‘ если статус = 0, пустая строка — другое
Wscript.Echo «all ok»
Set fsot = CreateObject(«Scripting.FileSystemObject» )
Set tft = fsot.OpenTextFile(«c:\testfile.txt»,ForA ppending, 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:\testfile.txt»,ForA ppending, True)
tft.WriteLine(«——————«)
tft.Close()
Set fsot = Nothing
Set tft= Nothing
Пояснения:
turbo.uralcom. com — сервер, при отсутствии пинг-ответа которого считаем, что есть проблема или с модемом или с коннектом. нельзя использовать сервера microsoft, т.к. они на пинги не отвечают. (Лучше вбить адрес гейта)
user — логин админа ADSL модема, указан в документации, для D-Link — админ
password — пароль админа модема, указан в документации или такой, как вы установили.
Использование:
сохранить в файл с расширением .vbs, добавить этот файл в Панель управления -> Назначенные задания -> Добавить задание
на периодичность запуска, скажем, в 30 минут.