В продолжение идеи, предложенной предыдущим автором [iredden], я создал скрипт для автоматизации пакетных команд с Linux-хоста. Сначала нужно настроить SSH для сервера, с которого будет выполняться этот скрипт. Смотрите . Создайте список Mikrotik роутеров… admin@watchdog:/$ cat /opt/ros/routers.txt
172.16.48.1
172.16.48.35
172.16.48.37 Создайте список команд… admin@watchdog:/$ cat /opt/ros/ros-commands
/system identity print
/system resource print Создайте файл имени пользователя/пароля admin@watchdog:/usr/sbin# cat /etc/monitor.passwd
remote||password И затем запустите скрипт, как показано ниже… ros-remote /opt/ros/ros-commands #!/usr/bin/perl
# By Matthew D. Smith © 2007 with help of the orignal script by
# by Ian Redden
# Purpose: To get info or execute commands on a Mikrotik RouterOS.
#
# Prerequisites: Expect, IO::Tty, IO:Stty
#
# Script will log into each router one a time (from ROUTER_LIST) and issue the commands from CMD_LIST one at a time.
#
# Usage: ros-remote [filename] ie; #ros-remote /opt/ros/ros-commands.txt
#
#
#######################CONFIGURATION########################################
# Text Listing of Routers - Insert Your Filename Here
my $ROUTER_LIST = '/opt/ros/routers.txt';
######################END CONFIGURATION#####################################
#############DO NOT ALTER BELOW THIS LINE###################################
# Open File
open DATA, "$ROUTER_LIST" or die "can't open $ROUTER_LIST $!";
# Assign array to Router List
my @routers_array = <DATA>;
# Close File - Done.
close (DATA);
# Assign variable to command file passed to script
my $CMD_LIST = "$ARGV[0]";
# Loop through each router in Array
foreach my $line (@routers_array)
{
# Use Expect
use Expect;
# Where is SSH?
$ssh = "/usr/bin/ssh";
# Get Username/Password
open(PS,"/etc/monitor.passwd");
while (<PS>) {
chomp;
($usernm,$pass) = split(/\|\|/, $_);
}
close(PS);
# Command to launch SSH
$command = "$ssh -l $usernm -i /root/.ssh/id_dsa $line";
# Use Expect to connect to Router
$ssh = Expect->spawn("$command");
# Do not echo Router Banner
$ssh->log_stdout(0);
# Send Password - enable if user account has password
# if ($ssh->expect(undef, "password:")) {
# print $ssh "$pass\r";
# }
# Send Commands From File
open( FILE, "< $CMD_LIST" ) or die "can't open $CMD_LIST $!";
if ($ssh->expect(undef, ">")) {
while ($cmd = <FILE>) {
# Echo Commands
$ssh->log_stdout(1);
print $ssh "$cmd\r";
$ssh->expect(undef, ">");
}
}
# Close File
close FILE;
#Quit SSH Session
print $ssh "/quit\r";
}
print "\r"; Я планирую использовать это для распространения общего списка правил брандмауэра на все мои роутеры, как только разберусь, как либо удалить все существующие правила брандмауэра, либо как избежать дублирования правил… Планирую в дальнейшем расширять функциональность, например, осуществлять опрос соседа MT для получения списка роутеров, создавать некий php/mysql интерфейс для поддержки списка команд/роутеров и т. д. Буду благодарен за любую помощь! Я знаю, что SNMP Write появится в версии 3.0, но надеюсь, это поможет тем, кто планирует использовать версию 2.x на некоторое время… -Matt
172.16.48.1
172.16.48.35
172.16.48.37 Создайте список команд… admin@watchdog:/$ cat /opt/ros/ros-commands
/system identity print
/system resource print Создайте файл имени пользователя/пароля admin@watchdog:/usr/sbin# cat /etc/monitor.passwd
remote||password И затем запустите скрипт, как показано ниже… ros-remote /opt/ros/ros-commands #!/usr/bin/perl
# By Matthew D. Smith © 2007 with help of the orignal script by
# by Ian Redden
# Purpose: To get info or execute commands on a Mikrotik RouterOS.
#
# Prerequisites: Expect, IO::Tty, IO:Stty
#
# Script will log into each router one a time (from ROUTER_LIST) and issue the commands from CMD_LIST one at a time.
#
# Usage: ros-remote [filename] ie; #ros-remote /opt/ros/ros-commands.txt
#
#
#######################CONFIGURATION########################################
# Text Listing of Routers - Insert Your Filename Here
my $ROUTER_LIST = '/opt/ros/routers.txt';
######################END CONFIGURATION#####################################
#############DO NOT ALTER BELOW THIS LINE###################################
# Open File
open DATA, "$ROUTER_LIST" or die "can't open $ROUTER_LIST $!";
# Assign array to Router List
my @routers_array = <DATA>;
# Close File - Done.
close (DATA);
# Assign variable to command file passed to script
my $CMD_LIST = "$ARGV[0]";
# Loop through each router in Array
foreach my $line (@routers_array)
{
# Use Expect
use Expect;
# Where is SSH?
$ssh = "/usr/bin/ssh";
# Get Username/Password
open(PS,"/etc/monitor.passwd");
while (<PS>) {
chomp;
($usernm,$pass) = split(/\|\|/, $_);
}
close(PS);
# Command to launch SSH
$command = "$ssh -l $usernm -i /root/.ssh/id_dsa $line";
# Use Expect to connect to Router
$ssh = Expect->spawn("$command");
# Do not echo Router Banner
$ssh->log_stdout(0);
# Send Password - enable if user account has password
# if ($ssh->expect(undef, "password:")) {
# print $ssh "$pass\r";
# }
# Send Commands From File
open( FILE, "< $CMD_LIST" ) or die "can't open $CMD_LIST $!";
if ($ssh->expect(undef, ">")) {
while ($cmd = <FILE>) {
# Echo Commands
$ssh->log_stdout(1);
print $ssh "$cmd\r";
$ssh->expect(undef, ">");
}
}
# Close File
close FILE;
#Quit SSH Session
print $ssh "/quit\r";
}
print "\r"; Я планирую использовать это для распространения общего списка правил брандмауэра на все мои роутеры, как только разберусь, как либо удалить все существующие правила брандмауэра, либо как избежать дублирования правил… Планирую в дальнейшем расширять функциональность, например, осуществлять опрос соседа MT для получения списка роутеров, создавать некий php/mysql интерфейс для поддержки списка команд/роутеров и т. д. Буду благодарен за любую помощь! Я знаю, что SNMP Write появится в версии 3.0, но надеюсь, это поможет тем, кто планирует использовать версию 2.x на некоторое время… -Matt
