Требуется получить MAC-адрес клиента, при подключении к моему серверу. Просто я сделал идентификацию пользователей по IP, а хотелось бы по связке IP+MAC. Никак не могу найти инфу о том как получить MAC-адрес клиента на perl. Подскажите, плз. Хотелось бы чтобы это был переносимый код (а не жестко привязанный к никсам). Хотя сервер планируется запускать на FreeBSD, но хотелось бы чтоб код работал и на Windows.
Сходите на www.cpan.org и поглядите на модули Net::Mac::Vendor и Net::MacMap. Не это ли вы ищете?
>Сходите на www.cpan.org и поглядите на модули Net::Mac::Vendor и Net::MacMap. Не это
>ли вы ищете?
Нет, к сожалению это не то. Эти модули по мак-адресу определяют производителя карты, а мне нужно получить мак-адрес подключившегося клиента.. :(
$mac=`/usr/sbin/arp -n $ip|awk '{print $4}'`
>$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";
>НЕ никс системы... По прежнему ищу инфу... Среди модулей ничего конкретного
>пока не нашел...Net-ARP на CPAN
>>НЕ никс системы... По прежнему ищу инфу... Среди модулей ничего конкретного
>>пока не нашел...
>
>Net-ARP на CPAN
Работает только с linux b freebsd :(
>Работает только с linux b freebsd :(Сомневаюсь. Без проблем должно работать в MacOS, Solaris, Irix, ...
>>Работает только с linux b freebsd :(
>
>Сомневаюсь. Без проблем должно работать в MacOS, Solaris, Irix, ...
А ты посмотри код который там имеется..
if( freebsd) { ...}
else { linux...}МакОс - это таже фрибзд, только немного исковерканная :-))). А вот с виндой работать не будет этот модуль...
идентификацию пользователей лучше делать по паролю
>идентификацию пользователей лучше делать по паролю
Это не окончательная идентификация - это просто проверка - можно ли от этого пользователя принять пароль или нет.. А авторизация у меня идет даже не по паролю а по криптованному ключу. Высылаю правильному клиенту (с разрешенными IP+MAC) рандомную строку - он у себя ее криптует по определенному алгоритму и с использованием в качестве salt'a криптованного пароля и пересылает серверу - тот делает тоже самое и сверяет строки. 3-ступенчатый хэндшэйк, и вот к нему-то я и хотел прикрутить проверку MAC.
В общем - я написал прогу на С для получения МАК адреса на 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???
>Принимает в качестве аргумента командной строки IP, и выводит MAC.
>Но вот как все это записать для XSUB???http://search.cpan.org/dist/perl/pod/perlxstut.pod
в чем проблема? - там все ясно расписано.
>>Принимает в качестве аргумента командной строки IP, и выводит MAC.
>>Но вот как все это записать для XSUB???
>
>http://search.cpan.org/dist/perl/pod/perlxstut.pod
>
>в чем проблема? - там все ясно расписано.
Тогда может быть переделаете функцию? :-))
Временное решение - я описал тут
http://poizon.net.ru/?s=4.
Не очень элегантно... но с xsub у меня не заладилось...
Может под win стоит попробовать сначала ping -n 1 ip_addr чтобы запись добавилась в арп таблицу если её нету, а потом arp -a и "выдрать" из выдачи команды нужный мак?
>Требуется получить MAC-адрес клиента, при подключении к моему серверу. Просто я сделал
>идентификацию пользователей по IP, а хотелось бы по связке IP+MAC. Никак
>не могу найти инфу о том как получить MAC-адрес клиента на
>perl. Подскажите, плз. Хотелось бы чтобы это был переносимый код
>(а не жестко привязанный к никсам). Хотя сервер планируется запускать на
>FreeBSD, но хотелось бы чтоб код работал и на Windows.
p5-NetPacket - в портах, рулезная вешь ;)