Ребята всем добрый день, подскажите какой либо скрипт для удаленной перезагрузки микротика.
Либо что бы он по телнету заходил и задавал команду /system reboot
Либо что бы можно было через API тоже самое сделать.
По телнету пробовал так:
#!/bin/bash
(
sleep 3
echo "login"
sleep 5
echo "pass"
sleep 5
echo "/system reboot y"
) | telnet 192.168.0.12
в ответ зашел на микротик, но при вводе команд получаю кучу иероглифов:
# ./mik2.sh
Trying 192.168.0.12...
Connected to 192.168.0.12.
Escape character is '^]'.
MikroTik v5.21
Login: login
Password:
MMM MMM KKK TTTTTTTTTTT KKK
MMMM MMMM KKK TTTTTTTTTTT KKK
MMM MMMM MMM III KKK KKK RRRRRR OOOOOO TTT III KKK KKK
MMM MM MMM III KKKKK RRR RRR OOO OOO TTT III KKKKK
MMM MMM III KKK KKK RRRRRR OOO OOO TTT III KKK KKK
MMM MMM III KKK KKK RRR RRR OOOOOO TTT III KKK KKK
MikroTik RouterOS 5.21 © 1999-2012 http://www.mikrotik.com/
^[[?62;1;2;6;7;8;9c^[[48;3R
Connection closed by foreign host.
Скрипт перезагрузки микротика с удаленной машины
- simpl3x
- Модератор
- Сообщения: 1532
- Зарегистрирован: 19 апр 2012, 14:03
Код: Выделить всё
#!/usr/bin/perl
use Net::Telnet ();
$t = new Net::Telnet ;
$user="username";
$pass="password";
$epass="enable";
$host="10.100.100.1";
print("Подключаемся к: $host\n");
$t=new Net::Telnet(Host => "$host", Timeout => 30);
$t->max_buffer_length(500000);
($prematch, $match)=$t->waitfor('/login:.*$/i');
print("$match $user\n");
$t->print("$user");
($prematch, $match)=$t->waitfor('/password:.*$/i');
print("$match $pass\n");
$t->print("$pass");
($prematch, $match)=$t->waitfor('/>.*$/i');
$t->print("/system reboot y");
$t->waitfor('/>.*$/i');
print("Отключаемся от: $host\n");
$t->close;
попробуйте как нибудь так, не перле
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
simpl3x писал(а):попробуйте как нибудь так, не перле
спасибо, но не совсем корректно отрабатывает данная команда:
$t->print("/system reboot y");
т.е. если написано так в скрипте, то микротик не ребутиться.
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
чуть изменил окончание
$t->print("/system reboot");
($prematch, $match)=$t->waitfor('/].*$/i');
$t->print("y\n");
$t->waitfor('/shortly.*$/i');
print("Отключаемся от: $host\n");
$t->close;
$t->print("/system reboot");
($prematch, $match)=$t->waitfor('/].*$/i');
$t->print("y\n");
$t->waitfor('/shortly.*$/i');
print("Отключаемся от: $host\n");
$t->close;
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
Скрипт работает пока роутер сильно не нагружен, как только появляется сильная нагрузка, то начинает подтупливать и не всегда выполняется.
Решил попробовать сделать через Perl на API.
Библиотеку Milrotik API залили на сервер в /etc/perl
создал пока вот такой простенький скрипт:
вроде бы работает, если API на стандартном порту.
А мне надо подключиться не совсем на стандартный, но это я думаю можно поправить через библиотеку API.
Теперь осталось вроде бы отправить ему команду /system/reboot
но с логикой отправки команд на микротик через API так и не разобрался(((
Надеюсь на вашу помошь.
Решил попробовать сделать через Perl на API.
Библиотеку Milrotik API залили на сервер в /etc/perl
создал пока вот такой простенький скрипт:
Код: Выделить всё
#!/usr/bin/perl -w
use strict;
use vars qw($error_msg $debug);
use Mtik;
my($mtik_host) = '192.168.0.12';
my($mtik_username) = 'login';
my($mtik_password) = 'pass';
my($mtik_port) = '58728';
print "Logging in to Mtik: $mtik_host\n";
if (Mtik::login($mtik_host,$mtik_username,$mtik_password))
{
Mtik::logout;
}
вроде бы работает, если API на стандартном порту.
А мне надо подключиться не совсем на стандартный, но это я думаю можно поправить через библиотеку API.
Теперь осталось вроде бы отправить ему команду /system/reboot
но с логикой отправки команд на микротик через API так и не разобрался(((
Надеюсь на вашу помошь.
- simpl3x
- Модератор
- Сообщения: 1532
- Зарегистрирован: 19 апр 2012, 14:03
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
simpl3x писал(а):Код: Выделить всё
Mtik::mtik_cmd('/system/reboot');
как то так вроде
ок, спасибо попробую завтра.
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
В общем получаю в ответ это
строка на которую ругается скрипт
Код: Выделить всё
# ./mik5.pl
Logging in to Mtik: 192.168.0.12
Logged in to 192.168.0.12 as sergej
Can't use an undefined value as a HASH reference at /etc/perl/Mtik.pm line 355.
строка на которую ругается скрипт
Код: Выделить всё
sub mtik_cmd
{
my($cmd) = shift;
my(%attrs) = %{(shift)};
$error_msg = '';
my(@command);
push(@command,$cmd);
foreach my $attr (keys (%attrs))
{
push(@command,'=' . $attr . '=' . $attrs{$attr});
}
my($retval,@results) = talk(\@command);
if ($retval > 1)
{
$error_msg = $results[0]{'message'};
}
return ($retval,@results);
}
- simpl3x
- Модератор
- Сообщения: 1532
- Зарегистрирован: 19 апр 2012, 14:03
-
- Сообщения: 61
- Зарегистрирован: 19 июн 2012, 06:34
my(%attrs) = %{(shift)};