ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Метки статьи: ‘perl’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Поводом для написания этой статьи послужила задача, которая возникла перед нами вчера.

Задача звучала просто: необходимо установить LG (Looking Glass) для отображения информации с BGP роутера FreeBSD с установленной quagga.

Что такое LG ?

Looking Glass позволяет выполнить на BGP роутере команды и отобразить результат их выполнения в web-интерфейсе:

  • show ip bgp
  • show ip bgp neighbors advertised-routes
  • show ip bgp summary
  • ping
  • traceroute

Для получения данных с роутера LG может использовать протоколы:  SSH, telnet или rsh.

Мы пользуемся telnet`ом.

LG мы всегда использовали один. Это разработка Cougar официальный сайт www.version6.net.

LG screenshot

Данный LG написан на языке программирования PERL и является CGI скриптом. Для соединения использует PERL модуль  Net::Telnet (/usr/ports/net/p5-Net-Telnet)

Последняя версия LG, доступная на это момент, датируется 25.11.2004 года и имеет номер 1.9.

Скачать исходный код можно на официальном сайте http://www.version6.net/lg/lg-1.9.tar.bz2 или с нашего сайта http://subnets.ru/files/lg-1.9.tar.bz2.

Ранее мы использовали этот LG для получения инфы с Juniper, а тут понадобилось получить с quagga (демон bgpd).

Установили LG, зашли в web-интерфейс LG и ….. и нифига. По нажатию на кнопку «Submit» LG просто долго «думает» (подвисает), а затем выдает страницу с запрошенной командой и пустым результатом.

Пара слов об установке.

В README автор достаточно четко описал что надо делать, повторяться мы не будем, но позволим себе добавить кусок конфига для HTTP сервера apache:

<VirtualHost XXX.XXX.XXX.XXX:80>
    ServerAdmin mymail@mydomain.ru
    DocumentRoot /usr/local/www/lg
    ServerName lg.subnets.ru

    ScriptAlias / /usr/local/www/lg/cgi/lg.cgi

    ErrorLog /var/log/http/lg_error.log
    CustomLog /var/log/http/lg_access.log common

    <Directory "/usr/local/www/lg">
        Options -Indexes FollowSymLinks MultiViews
        AllowOverride All
    </Directory>
</VirtualHost>

Сначала подумали, что мы напортачили в конфиге, но после перечитывания мануала и разнообразных вариантов конфига стало понятно, что дело не в нем.

Остро встал вопрос о debug`е действий LG, но разработчик не предусмотрел такой возможности :(  В логах появляется лишь строчка с запросом и ничего больше….

Пришлось лезть в исходки. В результате изысканий стало понятно, что проблема возникает уже после установки telnet соединения  между LG и quagga (демоном bgpd).

Это удалось понять используя более детальное логирование действий LG и просмотра вывода tcpdump:

tcpdump -Xni lo0 port 2605

Слушали ифейс lo0 (loopback) т.к. LG и quagga находтся на одном сервере и bgpd запущен командой:

/usr/local/sbin/bgpd -d -A 127.0.0.1

Возникает она потому что скрипт не может заматчить «command prompt», иными словами строку приглашения.

Что делать ? Разбираться с этим дальше уже нет времени, т.к. на выяснение проблемы уже убили кучу времени.

Тут я вспомнил про порт p5-Net-Telnet-Cisco (/usr/ports/net-mgmt/p5-Telnet-Cisco).  Примеры  использовании этого порта я показывал в статье Backup конфига Cisco на FTP.

Решил по быстрому попробовать такой вариант подключения по telnet к quagga. Сказано — сделано. Установил  порт p5-Net-Telnet-Cisco, поправил исходный код lg.cgi и все заработало.

Думаю что мы не единственные кто сталкивался/столкнулся/столкнется :))) с этой проблемой, надеюсь эта статья вам поможет.

Модифицированный нами код можно скачать тут: http://subnets.ru/files/lg-1.9.1.tar.gz
В архиве присутствуют файлы:

  • lg-1.9_ORIGINAL.tar.gz — это оригинальный архив от автора LG
  • lg.cgi.diff — это DIFF файл между оригинальной версией и модифицированной

Уточню, что код модифировался только в части отвечающий за подключение по telnet`у к quagga, остальной код остался без изменений.

Списки Looking Glass в Инете:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Пожалуйста, уважайте чужой труд.

Авторы: Панфилов Алексей (lehis (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 5,00 из 5)
Loading...Loading...
Отправить на почту Отправить на почту

Иногда требуется выполнять команды на удаленных серверах, запускать какие либо скрипты, выводить отработку команд в web-интерфейс.

Например для обновлений правил firewall или вывода результата отработки какой либо команды в web-интерфейс, обновления содержимого файлов на сервере, мониторинг температуры и т.д. и т.п. список можно продолжать бесконечно.

Для реализации этой задачи нам понадобится две вещи:

  1. порт ucspi-tcp
  2. небольшой perl скрипт

Приступим. Начнем с установки порта:

/usr/ports/sysutils/ucspi-tcp

ucspi-tcp is a set of command-line tools for building TCP-based
client/server applications.  They are compliant to UCSPI, the
UNIX Client-Server Program Interface.  UCSPI tools are available
for several different types of networks.
WWW: http://cr.yp.to/ucspi-tcp.html

cd /usr/ports/sysutils/ucspi-tcp
make install clean

После установки нам необходимо создать файл, в котором укажем какие IP-адреса или подсети, которые смогут обращаться к нам, например это будут:

  • 127.0.0.1
  • 10.100.1.0/24

для этого создадим файл /etc/tcp.server со следующим содержанием:

127.0.0.1:allow,RELAYCLIENT=»»
10.100.1.:allow,RELAYCLIENT=»»

Затем сформируем cdb файл:

/usr/local/bin/tcprules /etc/tcp.server.cdb /etc/tcp.server.tmp < /etc/tcp.server

Теперь напишем небольшой скрипт на perl, /usr/local/sbin/scripts/serv_main.pl.
Скрипту будут передаваться команды, вида:

  • cmd=X;
  • cmd=X PARAMS;

Можно передать все команды и одной строкой, разделяя их символом «;»

Для примера покажу обработку 3-х переданных команд:

  • cmd=1;                                      — вывод списка существуюших интерфейсов tun на данном сервере
  • cmd=2 -h 192.168.1.15;    — добавляем этот IP в firewall ipfw
  • cmd=3 ad4;                            — выводим температуру HDD
#!/usr/bin/perl                                                                                                                     

$scr_path="/usr/local/sbin/scripts";
$cr="\r\n";
$addr=$ENV {TCPREMOTEIP};
$date=`date "+[%Y-%m-%d %H:%M:%S]"`;
chomp($date);
#Открываем лог файл для записи
open(LOG,">>/var/log/serv.log");
if (chk($addr)){
        #Проверяем с какого IP к нам подключились и если его нет в списке (см. функцию chk), то запрещаем выполнение команд
        print "Forbidden".$cr;
        print LOG $date." [".$addr."]: Forbidden\n";
}else{
        #Скрипту может передаваться список команд разделенных символом ";"
        $arg=<STDIN>;
        @a=split(';',$arg);
        pop @a;
        print LOG $date." [".$addr."]: ".@a."\n";
        #Разбираем в цикле переданные команды
        foreach $par (@a){
                $e.="[".++$nn."]: ".$par."\n";
                $l.=$par." ";
                #Проверяем синтаксис переданной команды и разбираем параметры
                if ($par=~/cmd=(\d{1,2})\s*([\w.]*)/){
                        $b=$1;
                        if ($b eq "1"){
                                #Переданная команда cmd=1;
                                #Выполняем функцию cmd1
                                cmd1();
                        }elsif ($b eq "2"){
                                #Переданная команда cmd=2 -h 192.168.1.15;
                                if ($par=~/^cmd=2\s\-h\s(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/){
                                      $ip=$1;
                                      cmd2($ip);
                                }
                        }elsif($b eq "3"){
                                #Переданная команда cmd=3 ad4;
                                if ($par=~/^cmd=3\s(ad\d{1})$/){
                                           hdd_temp($1);
                               }
                        }
                }
        }
}
close LOG;                                                                                                                          

sub chk {
        #Проверяем IP с которого пытаются отдать команду
        my $ip=shift;
        if ($ip eq "127.0.0.1") {return 0;}
        if ($ip eq "10.100.1.2") {return 0;}
        return 1;
}
sub cmd1 {
    #Выводим список существующих на сервере интерфейсов tun
    @a=`netstat -rn | /usr/bin/grep tun`;
    foreach $tun (@a){
        chomp($tun);
                if ($tun=~/(\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3})\s+\S+\s+\S+\s+\S+\s+\S+\s+(tun\d+)/){
                        print $1.";".$2."\n";
                }
    }
}
sub cmd2 {
    #Добаляем переданный IP в firewall, в таблицу table(10)
    my $ip=shift;
    `/sbin/ipfw table 10 add $ip/32 0`;
     print "IP $ip added\n";
}
sub hdd_temp {
    #Выводим температуру жесткого диска
    my $hdd=shift;
    $hdd_temp=`/usr/local/sbin/smartctl -a /dev/$hdd | /usr/bin/grep '194 Temper' | /usr/bin/awk '{ print $10 }'`;
    print $hdd_temp;
}

На этих трех простых примерах можно понять что передавать и как обрабатывать полученные команды. Поле для вашего творчества неограниченно. Вы можете отрабатывать команды описанные в самом serv_main.pl или передавать эти параметры другим скриптам на сервере.

Сделаем файл /usr/local/sbin/scripts/serv_main.pl исполняемым:

/bin/chmod a+x /usr/local/sbin/scripts/serv_main.pl

Можете запустить его руками, убедиться, что он запускается и не содержит ошибок, запустим:

/usr/local/sbin/scripts/serv_main.pl

Затем введите команду:

cmd=1;

На экран будет выведен результат отпработки функции cmd1()

Подготовим стартовый скрипт 0_zstart.sh и расположим его в /usr/local/etc/rc.d:

#!/bin/sh

case "$1" in
start)
         ip=10.100.1.15
         port=5555
         path=/usr/local/sbin/scripts
         /usr/local/bin/tcpserver -v -H -R -l 0 -c 10 -x /etc/tcp.server.cdb ${ip} ${port} ${path}/serv_main.pl &
         echo ' Zserver started...'
         ;;
stop)
         /usr/bin/killall -9 tcpserver
         echo ' Zserver stoped...'
         ;;
*)
         echo "Usage: `basename $0` {start|stop}" >&2
         ;;
esac

Этот sh скрипт запускает tcpserver на порту 5555 и IP-адресе 10.100.1.15, принимает наш perl скрипт serv_main.pl в кач-ве параметра и ему (perl скрипту) tcpserver будет передавать полученные команды.

Запустим наше творение:

/usr/local/etc/rc.d/0_zstart.sh start

Проверим его наличие в списке процессов:

/bin/ps -ax | grep tcpserver

1251 con- I      0:00.24 /usr/local/bin/tcpserver -v -H -R -l 0 -c 10 -x /etc/tcp.server.cdb 10.100.1.15 ……..

Ну и убедимся, что порт 5555 прослушивается:

/usr/bin/sockstat | grep 5555
root     tcpserver  1251  3  tcp4   10.100.1.15:5555       *:*

Теперь можно испытать нашу конструкцию, например telnet`ом.

Для этого запустим команду telnet с хоста, IP которого разрешен для выполнения команд, в моем примере это хост 10.100.1.2.

telnet 10.100.1.15 5555

Trying 10.100.1.15…
Connected to 10.100.1.15.
Escape character is ‘^]’.

Если мы подключились, то теперь можно отдать одну из наших запрограммированных команд:

cmd=1;

Ну и увидим результат её отработки:

192.168.2.12;tun37
192.168.2.17;tun25
192.168.2.18;tun44
192.168.2.20;tun76
………………………….
192.168.2.228;tun126

После полной отработки команды произойдет отключение от сервера:

Connection closed by foreign host.

Вот и все.  Теперь команды можно отдавать, например:

  • из консоли telnet`ом
  • из другого perl скрипта используя IO::Socket
  • из web-интерфейса — php скрипта используя Sockets Support

Этот клиент-сервер ограничен только вашей фантазией.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы:  Панфилов Алексей (lehis (at) subnets.ru) и Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 5,00 из 5)
Loading...Loading...
Отправить на почту Отправить на почту

Провайдеры предоставляющие доступ по PPPoE зачастую сталкиваются с проблемой, когда кто-то из клиентов поднимает PPPoE сервер смотрящий в локалку провайдера.

Т.к. «левый» PPPoE сервер принимает подключения для любого service-name, то как результат:

абоненты провайдера не могут подключиться по PPPoE и получить доступ к услуге.

Предлагаем вашему вниманию скрипт по поиску «левых» PPPoE серверов.

Файл pppoe_search.pl:

#!/usr/bin/perl

if ($#ARGV<0){
        die "Usage: $0 <iface> [service name] [debug]\n";
}else{
        $iface=$ARGV[0];
        if ($ARGV[1] ne '' && $ARGV[1] ne 'debug'){
                $sn=":".$ARGV[1];
                $debug=$ARGV[2];
        }else{
                $debug=$ARGV[1];
        }
}

open F, "netstat -Wni | grep Link | grep -v tun | grep -v ng | grep -v '*' | grep -v lo0 | grep $iface |" or die "Can't exec finding MAC addresses\n";
while (<F>){
        if ($_=~/^$iface\s+\d+\s\<Link#\d{1,3}\>\s+(\S{17})\s/){
                $mac=$1;
        }
}
if (!$mac){
        die "Can't find MAC for [$iface]. Exit...\n";
}
open F, ">/tmp/ppp.conf";
print F "client:
 set device PPPoE:$iface$sn
 set redial 2 2
";
close F;
open F , "grep -w '/tmp/ppp.conf' /etc/ppp/ppp.conf |" or die "Can't exec grep\n";
while (<F>){
        $c=$_;
}
close F;
if (!$c){
        die "Can't find include client's section\n";
}else{
        print "Found MAC [$mac] at $iface\n";
}
if(($pid = fork)) {
        $SIG{CHLD} = 'IGNORE';
        $cmd=sprintf "/usr/sbin/tcpdump -e -n -c 1 -i %s ether proto 0x8863 and ether dst %s and 'ether[0xF:1]=0x7' 2>&1 |",$iface,$mac;
        if ($debug){
                print "DEBUG: ===>[$cmd]<===\n";
        }
        open F,$cmd or die "Can't start tcpdump\n";
        while (<F>){
                chomp($_);
                if ($debug){
                        print "DEBUG: ===>[$_]<===\n";
                }
                if ($_=~/^.+\s(.{17})\s\>\s(.{17}).+PPPoE\sPADO\s\[(.*)\]\s\[(.*)\]\s\[(.*)\]\s\[Host\-Uniq.+/){
                        print "\nFound asshole on iface $iface (iface's MAC: $2)\n
                        ======================================================\n
                        PPPoE at MAC: [$1]\nComp name: [$3]\nListening service name: [$5]\n
                        ======================================================\n\n";
                }elsif ($_=~/^.+\s(.{17})\s\>\s(.{17}).+PPPoE\sPADO\s\[(.*)\]\s\[(.*)\]\s\[Host\-Uniq.+/){
                        print "\nFound asshole on iface $iface (iface's MAC: $2)\n
                        ======================================================\n
                        PPPoE at MAC: [$1]\nComp name: [$3]\nListening service name: [$4]\n
                        ======================================================\n\n";
                }elsif ($_=~/ Device not configured/){
                        die "Wrong iface name [$iface]\n";
                }
        }
        close F;
}else{
        `/usr/sbin/ppp -foreground client`;
}

Далее в файл /etc/ppp/ppp.conf добавляем строчку:

!include /tmp/ppp.conf

Внимание, эта строка НЕ должна начинаться с пробела.

Осталось сделать файл запускным:

chmod a+x pppoe_search.pl

Ну и запускаем его на исполнение и видим:

Usage: ./getto.pl <iface> [service name] [debug]

Т.е. для того что бы скрипт начал поиск ему необходимо передать параметры: имя интерфейса, на котором будем искать, и имя service-name, который ищем.

Пример:

/getto.pl bge1 myservicename

тоже самое, но в выводом дебага:

/getto.pl bge1 myservicename debug

Скрипт желательно запускать со своего  PPPoE сервера, скрипт исключит мак адрес своего сервера (на котором он был запущен).

Удачного вам поиска 😉

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 6, среднее: 3,67 из 5)
Loading...Loading...
Отправить на почту Отправить на почту

В продолжении статьи Backup конфига Cisco на FTP, не забудем про Juniper.

Допустим что:

192.168.1.3 — IP-адрес Juniper
192.168.1.254 — IP-адрес backup сервера

Приступим:

Для начала на наш FreeBSD backup сервер нужно установить порт, но не тот, что и в случае с циской:

cd /usr/ports/net/p5-Net-Telnet
make install clean

После того как порт установился напишем небольшой perl скрипт:

#!/usr/bin/perl

use Net::Telnet ();

@c=("192.168.1.3");  #Массив с IP-адресами того что будем бекапить
@cn=("juniper.conf");  #Как будет называться конфиг после бекапа
@login=("backup");      #Логин на оборудование
@pass=("passwd");       #Пароль

$ftp="192.168.1.254";
$ftpuser="juniper-backup";      #Логин к FTP
$ftpass="ftpPasswd";           #Пароль к FTP

$maindir="/backup/juniper";     #Папка доступная по FTP

#Определяем папки в $maindir в формате ГОД/МЕСЯЦ/ДЕНЬ/ЧАС куда будет перемещен конфиг после закачки его на FTP
$dir="$maindir/inet";
$backup_dir=`date +"%Y/%m/%d/%H"`;
chomp($backup_dir);
$backup_dir="$dir/$backup_dir";

#Проверяем наличие директории куда будет складываться backup и
#Создаем директорию если её не существует
opendir(D,$backup_dir) or `/bin/mkdir -p $backup_dir`;
closedir D;

#Цикл по массиву с IP-адресами железок
for ($i=0;$i<=$#c;$i++){
        my $h=sprintf("%s",$c[$i]);
        my $conf=sprintf("%s",$cn[$i]);
        my $user=sprintf("%s",$login[$i]);
        my $pas=sprintf("%s",$pass[$i]);

        #Устанавливаем соединение с железкой и ловим строку приглашения
        #ВНИМАНИЕ !!! Ваша строка приглашения может отличаться !!!
        #Все зависит от имени железки, то которое вы ей задали, и логина с которым вы туда стучитесь
        $ses = new Net::Telnet (Timeout => 10,
                        Prompt => '/backup\\@juniper. $/');

        if ($ses->open($h)) {
                #Если соединение установлено
                $ses->login($user, $pas);
                @lines = $ses->cmd("configure");
                my $bcmd=sprintf("save ftp://%s:%s\@%s/%s",$ftpuser,$ftpass,$ftp,$conf);
                #Отправляем команды на backup
                @lines1 = $ses->cmd($bcmd);

        }else{
                warn "Can't: " . $ses->errmsg;
        }
         $ses->close;
        `/bin/sleep 3`;
        #Перемещаем закаченный на FTP конфиг в backup директорию
        #как итог она будет: /backup/cisco/inet/ГОД/МЕСЯЦ/ДЕНЬ/ЧАС
        system(sprintf("/bin/mv %s/%s %s",$maindir,$conf,$backup_dir));
}

Сохраняем наш скрипт, например как backup-juniper.pl

Делаем его запускаемым:

chmod a+x backup-juniper.pl

Вот и все. Осталось проверить его работу запустив руками, а затем, если все нормально, добавить его в crontab:

0 2 * * * root /backup/juniper/backup-juniper.pl

Что означает, что каждый день в 2:00 будет запускаться наш скрипт который сохранит конфиги Juniper в директории /backup/juniper/inet/ГОД/МЕСЯЦ/ДЕНЬ/ЧАС

Удачного вам бекапа !

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 3,00 из 5)
Loading...Loading...
Отправить на почту Отправить на почту

У Вас развелось много «железа» ?

Вы хотите, чтобы конфиги складывались на backup сервер автоматом ?

Это дело хорошее. Расскажу вам как это сделать один раз, в автоматическом режиме и забыть волнения по поводу «а если что упадет?».

Упадет — возьмете новую железку, зальете сохраненный конфиг и вперед !

Допустим что:

192.168.1.1 — IP-адрес cisco catalyst 2950 или cisco catalyst 2960
192.168.1.2 — IP-адрес cisco catalyst 3560G или любая другая циска :)
192.168.1.254 — IP-адрес backup сервера

Приступим:

Первый способ.

Для начала на наш FreeBSD backup сервер нужно установить порт:

cd /usr/ports/net-mgmt/p5-Telnet-Cisco
make install clean

После того как порт установился напишем небольшой perl скрипт:

#!/usr/bin/perl

use Net::Telnet::Cisco;

@c=("192.168.1.1","192.168.1.2");  #Массив с IP-адресами того что будем бекапить
@cn=("c2950.conf","c3560.conf");  #Как будет называться конфиг после бекапа
@login=("login","login");                 #Логин на оборудование
@pass=("c2950-passwd","c3560-passwd");       #Пароль
@passen=("en_passwd","en_passwd");             #Пароль на enable режим

$ftp="192.168.1.254";
$ftpuser="cisco-backup";      #Логин к FTP
$ftpass="ftpPasswd";           #Пароль к FTP

$maindir="/backup/cisco";     #Папка доступная по FTP

#Определяем папки в $maindir в формате ГОД/МЕСЯЦ/ДЕНЬ/ЧАС куда будет перемещен конфиг после закачки его на FTP
$dir="$maindir/inet";
$backup_dir=`date +"%Y/%m/%d/%H"`;
chomp($backup_dir);
$backup_dir="$dir/$backup_dir";

#Проверяем наличие директории куда будет складываться backup и
#Создаем директорию если её не существует
opendir(D,$backup_dir) or `/bin/mkdir -p $backup_dir`;
closedir D;

#Цикл по массиву с IP-адресами железок
for ($i=0;$i<=$#c;$i++){
        my $h=sprintf("%s",$c[$i]);
        my $conf=sprintf("%s",$cn[$i]);
        my $user=sprintf("%s",$login[$i]);
        my $pas=sprintf("%s",$pass[$i]);
        my $pasen=sprintf("%s",$passen[$i]);

        #Устанавливаем соединение с железкой
        my $session = Net::Telnet::Cisco->new(Host => $h);
        $session->login($user, $pas);
        # Enable mode
        if ($session->enable($pasen)) {
                #Если соединение установлено, то переходим в enable
                $session->errmode("return");
                my $bcmd=sprintf("copy startup-config ftp://%s:%s@%s",$ftpuser,$ftpass,$ftp);
                #Отправляем команды на backup
                my @output = $session->cmd('$bcmd');
                my @output1 = $session->cmd($ftp);
                my @output2 = $session->cmd("$conf");
        }else{
                warn "Can't enable: " . $session->errmsg;
        }
        $session->close;
        `/bin/sleep 3`;
        #Перемещаем закаченный на FTP конфиг в backup директорию
        #как итог она будет: /backup/cisco/inet/ГОД/МЕСЯЦ/ДЕНЬ/ЧАС
        system(sprintf("/bin/mv %s/%s %s",$maindir,$conf,$backup_dir));
}

Сохраняем наш скрипт, например как backup-cisco.pl

Делаем его запускаемым:

chmod a+x backup-cisco.pl

Вот и все. Осталось проверить его работу запустив руками, а затем, если все нормально, добавить его в crontab:

40 2 * * * root /backup/cisco/backup-cisco.pl

Что означает, что каждый день в 2:40 будет запускаться наш скрипт который сохранит конфиги цисок в директории /backup/cisco/inet/ГОД/МЕСЯЦ/ДЕНЬ/ЧАС

Второй способ.

Этот способ основан на кронтабе в самой циске.


Switch> enable
Switch# configure terminal
Switch# kron policy-list backup
Switch(config-kron-policy)# cli copy startup-config ftp://192.168.1.254
Switch(config-kron-policy)# exit
Switch(config)# ip ftp username cisco-backup
Switch(config)# ip ftp password ftpPasswd
Switch(config)# file prompt quiet
Switch(config)# kron occurrence backup at 2:40 recurring
Switch(config)# exit
Switch# wri

Посмотреть текущие kron задания можно командой:

show kron schedule

Удачного вам бекапа !

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Авторы: Николаев Дмитрий (virus (at) subnets.ru) и Панфилов Алексей (lehis (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 5,00 из 5)
Loading...Loading...
Отправить на почту Отправить на почту