URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4033
[ Назад ]

Исходное сообщение
"Получить MAC-адрес клиента средствами Perl"

Отправлено PoizOn , 05-Мрт-05 10:49 
Требуется получить MAC-адрес клиента, при подключении к моему серверу. Просто я сделал идентификацию пользователей по IP, а хотелось бы по связке IP+MAC. Никак не могу найти инфу о том как получить MAC-адрес клиента на perl.  Подскажите, плз. Хотелось бы чтобы это был переносимый код (а не жестко привязанный к никсам). Хотя сервер планируется запускать на FreeBSD, но хотелось бы чтоб код работал и на Windows.

Содержание

Сообщения в этом обсуждении
"Получить MAC-адрес клиента средствами Perl"
Отправлено allez , 05-Мрт-05 12:01 
Сходите на www.cpan.org и поглядите на модули Net::Mac::Vendor и Net::MacMap. Не это ли вы ищете?

"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 05-Мрт-05 12:20 
>Сходите на www.cpan.org и поглядите на модули Net::Mac::Vendor и Net::MacMap. Не это
>ли вы ищете?
Нет, к сожалению это не то. Эти модули по мак-адресу определяют производителя карты, а мне нужно получить мак-адрес подключившегося клиента.. :(



"Получить MAC-адрес клиента средствами Perl"
Отправлено a , 05-Мрт-05 13:19 
$mac=`/usr/sbin/arp -n $ip|awk '{print $4}'`

"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 05-Мрт-05 13:48 
>$mac=`/usr/sbin/arp -n $ip|awk '{print $4}'`

Спасибо - наверно так и придеться... Но код становиться не переносимым не НЕ никс системы... По прежнему ищу инфу... Среди модулей ничего конкретного пока не нашел...

Да вот как я это реализовал.. (кусочек кода)

#!/usr/bin/perl -w

my $ip="192.168.99.1";

$mac=`/usr/sbin/arp -n $ip`;
my $haddr=(stat(split(/\s+/,$mac)))[3];
print $haddr,"\n";


"Получить MAC-адрес клиента средствами Perl"
Отправлено ACCA , 06-Мрт-05 09:53 
>НЕ никс системы... По прежнему ищу инфу... Среди модулей ничего конкретного
>пока не нашел...

Net-ARP на CPAN


"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 09-Мрт-05 09:26 
>>НЕ никс системы... По прежнему ищу инфу... Среди модулей ничего конкретного
>>пока не нашел...
>
>Net-ARP на CPAN
Работает только с linux b freebsd :(



"Получить MAC-адрес клиента средствами Perl"
Отправлено ACCA , 09-Мрт-05 13:35 
>Работает только с linux b freebsd :(

Сомневаюсь. Без проблем должно работать в MacOS, Solaris, Irix, ...


"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 09-Мрт-05 13:55 
>>Работает только с linux b freebsd :(
>
>Сомневаюсь. Без проблем должно работать в MacOS, Solaris, Irix, ...
А ты посмотри код который там имеется..
if( freebsd) { ...}
else { linux...}

МакОс - это таже фрибзд, только немного исковерканная :-))). А вот с виндой работать не будет этот модуль...



"Получить MAC-адрес клиента средствами Perl"
Отправлено Leningrad , 09-Мрт-05 14:21 
идентификацию пользователей лучше делать по паролю

"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 09-Мрт-05 14:26 
>идентификацию пользователей лучше делать по паролю
Это не окончательная идентификация - это просто проверка - можно ли от этого пользователя принять пароль или нет.. А авторизация у меня идет даже не по паролю а по криптованному ключу. Высылаю правильному клиенту (с разрешенными IP+MAC) рандомную строку - он у себя ее криптует по определенному алгоритму и с использованием в качестве salt'a криптованного пароля и пересылает серверу - тот делает тоже самое и сверяет строки. 3-ступенчатый хэндшэйк, и вот к нему-то я и хотел прикрутить проверку MAC.



"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 11-Мрт-05 09:45 
В общем - я написал прогу на С для получения МАК адреса на Win. Проблема с тем чтобы оформить ее в модуль (через XSUB). Есть ли тут люди имеющие опыт в XSUB? Подскажите.
Вот код программы:

#include <windows.h>
#include <stdio.h>
#include <iphlpapi.h>

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "iphlpapi.lib")

void getmac (char *ip, char *yourIP, char *str);

int main(int argc, char* argv[])
{
        char *ip=argv[1];
        char *uip=argv[2];
                char str[32];

                getmac (ip, uip, str);

                printf ("%s", str);

        return 0;
}

void getmac (char *ip, char *yourIP, char *str){
        ULONG   ulMACAddr[2], ulSize = 6;
        LPBYTE  pBuffer;

        if (SendARP(inet_addr (ip), inet_addr(yourIP), ulMACAddr, &ulSize ) == NO_ERROR){
                pBuffer = (LPBYTE) ulMACAddr;

                sprintf (str, "%02X:%02X:%02X:%02X:%02X:%02X",
                                pBuffer[0],
                                pBuffer[1],
                                pBuffer[2],
                                pBuffer[3],
                                pBuffer[4],
                                pBuffer[5]);
        }
                else{
                        sprintf (str, "error");
                }

}

Принимает в качестве аргумента командной строки IP, и выводит MAC.
Но вот как все это записать для XSUB???



"Получить MAC-адрес клиента средствами Perl"
Отправлено karasiov , 11-Мрт-05 12:21 
>Принимает в качестве аргумента командной строки IP, и выводит MAC.
>Но вот как все это записать для XSUB???

http://search.cpan.org/dist/perl/pod/perlxstut.pod

в чем проблема? - там все ясно расписано.



"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 11-Мрт-05 14:59 
>>Принимает в качестве аргумента командной строки IP, и выводит MAC.
>>Но вот как все это записать для XSUB???
>
>http://search.cpan.org/dist/perl/pod/perlxstut.pod
>
>в чем проблема? - там все ясно расписано.
Тогда может быть переделаете функцию? :-))



"Получить MAC-адрес клиента средствами Perl"
Отправлено PoizOn , 11-Мрт-05 15:26 
Временное решение - я описал тут
http://poizon.net.ru/?s=4.
Не очень элегантно... но с xsub у меня не заладилось...


"Получить MAC-адрес клиента средствами Perl"
Отправлено Forth , 13-Мрт-05 01:19 
Может под win стоит попробовать сначала ping -n 1 ip_addr чтобы запись добавилась в арп таблицу если её нету, а потом arp -a и "выдрать" из выдачи команды нужный мак?

"Получить MAC-адрес клиента средствами Perl"
Отправлено falkon , 21-Мрт-05 10:55 
>Требуется получить MAC-адрес клиента, при подключении к моему серверу. Просто я сделал
>идентификацию пользователей по IP, а хотелось бы по связке IP+MAC. Никак
>не могу найти инфу о том как получить MAC-адрес клиента на
>perl.  Подскажите, плз. Хотелось бы чтобы это был переносимый код
>(а не жестко привязанный к никсам). Хотя сервер планируется запускать на
>FreeBSD, но хотелось бы чтоб код работал и на Windows.


p5-NetPacket - в портах, рулезная вешь ;)