Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > arp -n | grep $mac


Автор: Demeo 10.6.2016, 14:08
Доброго дня.

Есть кусок кода, который вытягивает мак-адрес из базы, и по нему грепает IP-адрес из таблицы ARP

$sql="SELECT users.id,users.name,login.mac FROM users,login WHERE users.id = ".$Mid." AND login.mid = ".$Mid." AND login.act = 47$

                $sth=&sql($dbh,$sql);

                while($p=$sth->fetchrow_hashref){
                        $mac = $p->{'mac'};
                        $cmd = q(awk '{print($1)}' | sed 's/(//' | sed 's/)//');
                        $ip_addr = `arp -n | grep $mac | $cmd`;

                        $OUT.="
                        <tr>
                                <td align=\"left\" width=\"200\"><b>".&Filtr_out($p->{'name'})."</b> (".&Filtr_out($p->{mac}).")</td>
                                <td align=\"left\" width=\"200\"><b>".&Filtr_out($p->{'name'})."</b> (".$ip_addr.")</td>

Если в строке строке $ip_addr = `arp -n | grep $mac | $cmd`;
стоит $mac - то не работает
Если вручную прописываю мак вместо переменной - работает

Автор: igorold 10.6.2016, 14:54
не пробовали записать в лог значение $mac ?
Какое значение принимает?

А вы когда ручками подставляете значение, вы его кавычками обрамляете?

Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/arp-n-grep-yemac-id575a9fcfae201511758b4567#findElement_E7045_575aaa5cae2015a3788b597a_0

Автор: Demeo 10.6.2016, 15:07
Принимает значение вида 00:00:00:00:00:00

Если в строку <td align=\"left\" width=\"200\"><b>".&Filtr_out($p->{'name'})."</b> (".$ip_addr.")</td>
вместо $ip_addr подставить $mac - то мак отображается корректно

Нет, кавычками не обрамляю -  $ip_addr = `arp -n | grep 11:11:11:11:11:11 | $cmd`;
В этом случае все нормально определяется

Автор: igorold 10.6.2016, 16:09
Я у себя проверил:

Код

#!/usr/bin/perl
use strict;

my $mac = '00:07:e9:5b:f0:53';
my $cmd = q(awk '{print($1)}' | sed 's/(//' | sed 's/)//');
my $ip_addr = `arp -n | grep $mac | $cmd`;

print $ip_addr."\n";



работает ... 

Автор: Demeo 10.6.2016, 16:43
так и у меня работает, вопрос почему из базы не берет?

Автор: ginnie 10.6.2016, 17:50
Цитата

так и у меня работает, вопрос почему из базы не берет? 

Покажите ваш
Код

print "arp -n | grep $mac | $cmd";

Автор: igorold 10.6.2016, 19:10
Цитата(Demeo @  10.6.2016,  16:43 Найти цитируемый пост)
так и у меня работает, вопрос почему из базы не берет?


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

Автор: Demeo 10.6.2016, 19:16
Все работает. Как оказалось, в арп-таблице тупо не было этих маков

Автор: _zorn_ 12.6.2016, 10:56
Вот только хотел посоветовать в консоле тоже самое набрать smile

Автор: saskuu 7.7.2016, 23:21
в свое время стояла аналогичная задача.
выяснил, что для более-менее сети (от 500 компов) искать по файлу /proc/net/arp в десятки! раз быстрее, чем пользоваться командой arp

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)