Страница 1 из 2

Скрипт перезагрузки микротика с удаленной машины

Добавлено: 13 ноя 2012, 04:56
djserg-minyar
Ребята всем добрый день, подскажите какой либо скрипт для удаленной перезагрузки микротика.
Либо что бы он по телнету заходил и задавал команду /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.

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 13 ноя 2012, 07:39
simpl3x

Код: Выделить всё

#!/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;

попробуйте как нибудь так, не перле

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 13 ноя 2012, 08:49
djserg-minyar
simpl3x писал(а):попробуйте как нибудь так, не перле

спасибо, но не совсем корректно отрабатывает данная команда:
$t->print("/system reboot y");

т.е. если написано так в скрипте, то микротик не ребутиться.

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 13 ноя 2012, 10:44
djserg-minyar
чуть изменил окончание
$t->print("/system reboot");
($prematch, $match)=$t->waitfor('/].*$/i');
$t->print("y\n");
$t->waitfor('/shortly.*$/i');
print("Отключаемся от: $host\n");
$t->close;

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 05 дек 2012, 17:16
djserg-minyar
Скрипт работает пока роутер сильно не нагружен, как только появляется сильная нагрузка, то начинает подтупливать и не всегда выполняется.

Решил попробовать сделать через 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 так и не разобрался(((

Надеюсь на вашу помошь.

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 05 дек 2012, 17:24
simpl3x

Код: Выделить всё

Mtik::mtik_cmd('/system/reboot');

как то так вроде

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 05 дек 2012, 19:10
djserg-minyar
simpl3x писал(а):

Код: Выделить всё

Mtik::mtik_cmd('/system/reboot');

как то так вроде

ок, спасибо попробую завтра.

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 06 дек 2012, 05:01
djserg-minyar
В общем получаю в ответ это

Код: Выделить всё

# ./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);
}

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 06 дек 2012, 06:49
simpl3x
какая из них 355

Re: Скрипт перезагрузки микротика с удаленной машины

Добавлено: 06 дек 2012, 07:08
djserg-minyar
my(%attrs) = %{(shift)};