The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
shell, perl arp запрос по ssh, !*! guseniza, 12-Ноя-12, 22:07  [смотреть все]
Всем привет.
В скриптописании практически полный нуль.
Хотел бы попросить помощи знающих.
Есть скрипт, который собирает мак адреса на сетевом оборудовании.
После того, как он собрал, он в качестве параметра передает мак скрипту ssh_arp.sh,
который в свою очередь смотрит в arp табл серверов и находит соответствующий маку ip адрес.
Казалось бы, что может быть проще:)

вот пример скрипта:

#!/bin/bash

mac=$1

serv=(10.0.0.1 10.0.0.2 10.0.0.3 10.0.0.4)
for ((i=0; i<=4; i++))
do
    rez=$(ssh vasya@${serv[$i]} "arp -a | grep $mac")

    ip=$(echo $rez |sed 's/(//;s/)//'| awk '{print $2}')
    mac_cl=$(echo $rez |sed 's/(//;s/)//'| awk '{print $4}')
        
        if [ -n "$rez" ]; then     
        echo "$ip  $mac_cl"
        fi
    
done

т.е он получает параметром мак и ищет его на каждом сервере поочереди.
выполняется крайне долго...
Написал аналогичный на скрипт perl, в надежде на ускорение процесса:

#!/usr/bin/perl -w

#$ARGV[0] mac адрес
use Net::OpenSSH;

@vpnserv=("10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4");

for ($i=0; $i<=4; $i++)
{
    my $user = 'vasya';
    my $ssh = Net::OpenSSH->new(host => $serv[$i], user => $user, port => 22);
    $ssh->error and die "SSH connection failed: " . $ssh->error;

    my $rv = $ssh->system("arp -a | grep $ARGV[0]");

    if ($? != 0) {
    print "Данные отсутсвуют";
    }

}
В сравнении с bash скриптом perl овый выполняется с такой же скоростью.

Скрипты явно не заслуживают похвал :), но я только начал...
В общем прошу помощи либо в оптимизации данного решения, либо предложите другое решение, которое будет работать быстрее моего.

По поводу того, насколько медленно выполняется... поиск 40 маков занимает порядка 7 минут. Т.к. маки могут быть на разных серверах.

  • shell, perl arp запрос по ssh, !*! hizel, 22:20 , 12-Ноя-12 (1)
    >  my $rv = $ssh->system("arp -a | grep $ARGV[0]");
    >  if ($? != 0) {
    >  print "Данные отсутсвуют";
    >  }

    ну правильно, в документации так и написано: "Returns true on sucess, undef otherwise."

    • shell, perl arp запрос по ssh, !*! guseniza, 22:25 , 12-Ноя-12 (2)
      >>  my $rv = $ssh->system("arp -a | grep $ARGV[0]");
      >>  if ($? != 0) {
      >>  print "Данные отсутсвуют";
      >>  }
      > ну правильно, в документации так и написано: "Returns true on sucess, undef
      > otherwise."

      на это не обращ внимания. Код работает. Получаю необходимый мне результат.
      Меня интересует либо как ускорить процесс поиска маков, либо предложение другого метода поиска
      >>  if ($? != 0) {
      >>  print "Данные отсутсвуют";
      >>  }

      Эта часть, вообще, для себя любимого :) для наглядности. Можете ее выкинуть:)

      • shell, perl arp запрос по ssh, !*! hizel, 22:29 , 12-Ноя-12 (3)
        > на это не обращ внимания. Код работает. Получаю необходимый мне результат.
        > Меня интересует либо как ускорить процесс поиска маков, либо предложение другого метода
        > поиска

        оу, ну запускайте параллельно, будет быстрее.

        • shell, perl arp запрос по ssh, !*! guseniza, 22:41 , 12-Ноя-12 (4)
          >> на это не обращ внимания. Код работает. Получаю необходимый мне результат.
          >> Меня интересует либо как ускорить процесс поиска маков, либо предложение другого метода
          >> поиска
          > оу, ну запускайте параллельно, будет быстрее.

          Это, конечно, вариант, но какой-то костыльный:))
          Хотя, вероятно, его и придется использовать

  • shell, perl arp запрос по ssh, !*! Etch, 03:36 , 13-Ноя-12 (5)
    > По поводу того, насколько медленно выполняется... поиск 40 маков занимает порядка 7
    > минут. Т.к. маки могут быть на разных серверах.

    А зачем вы по одному МАКу проверяете, если их у вас 40? Проверяйте сразу все в одной команде.

  • shell, perl arp запрос по ssh, !*! meantraitor, 12:10 , 13-Ноя-12 (7)
    > Всем привет.
    > В скриптописании практически полный нуль.
    > Хотел бы попросить помощи знающих.
    > Есть скрипт, который собирает мак адреса на сетевом оборудовании.
    > После того, как он собрал, он в качестве параметра передает мак скрипту
    > ssh_arp.sh,
    > который в свою очередь смотрит в arp табл серверов и находит соответствующий
    > маку ip адрес.
    > Казалось бы, что может быть проще:)

    Один раз собрать со всех серверов arp таблицы (arp -a), собрать в хэш-таблицу
    а потом просто выдавать $ip{$mac}

    Если диапазон ip-шников заранее известен и небольшой, можно их просто пропинговать, а
    потом сказать arp -a

    На худой конец, break в цикле поставить, если адрес найден

    • shell, perl arp запрос по ssh, !*! guseniza, 14:16 , 13-Ноя-12 (8)
      >[оверквотинг удален]
      >> ssh_arp.sh,
      >> который в свою очередь смотрит в arp табл серверов и находит соответствующий
      >> маку ip адрес.
      >> Казалось бы, что может быть проще:)
      > Один раз собрать со всех серверов arp таблицы (arp -a), собрать в
      > хэш-таблицу
      >  а потом просто выдавать $ip{$mac}
      > Если диапазон ip-шников заранее известен и небольшой, можно их просто пропинговать, а
      > потом сказать arp -a
      > На худой конец, break в цикле поставить, если адрес найден

      Примерно так и сделал. По крону собираю arp табл с серверов в файлы.
      "arp -a -n"  значительно быстрее отрабатывает, чем "arp -a".
      А потом просто ищу МАК в файле.
      Маков очень много, поэтому пинговать не вариант. Работает на 2 порядка быстрее :) Всем спасибо за советы:))

  • shell, perl arp п╥п╟п©я─п╬я│ п©п╬ ssh, !*! Salvador Fandi241o, 15:05 , 13-Ноя-12 (9)
    #! / Usr / bin / perl-w

    # $ARGV[0] mac address
    use Net::OpenSSH::Parallel;

    @vpnserv = ("10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4");

    my $p = Net::OpenSSH::Paralllel->new;

    $p->add_host($_) for @vpnserv;
    $p->all(cmd => "arp -a | grep $ARGV[0]");
    $p->run;

    for my $vpnserv (@vpnserv) {
      if ($p->get_error($vpnserv)) {
        print "MAC $ARGV[0] not found on $vpnserv\n"
      }
    }

    • shell, perl arp п╥п╟п©я─п╬я│ п©п╬ ssh, !*! guseniza, 21:31 , 13-Ноя-12 (10)
      >[оверквотинг удален]
      > @vpnserv = ("10.0.0.1", "10.0.0.2", "10.0.0.3", "10.0.0.4");
      > my $p = Net::OpenSSH::Paralllel->new;
      > $p->add_host($_) for @vpnserv;
      > $p->all(cmd => "arp -a | grep $ARGV[0]");
      > $p->run;
      > for my $vpnserv (@vpnserv) {
      >   if ($p->get_error($vpnserv)) {
      >     print "MAC $ARGV[0] not found on $vpnserv\n"
      >   }
      > }

      вот спасибо, добрый человек:)))




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру