Увеличение MAC-адреса - PullRequest
       1

Увеличение MAC-адреса

1 голос
/ 15 апреля 2011

Я пытаюсь разработать скрипт, который будет частично генерировать список MAC-адресов из заданной стартовой базы. В качестве входных данных у меня есть список MAC-адресов, которые нужно увеличить на 1.

Примеры:

00:1D:FE:12:37:1A (необходимо сгенерировать 00:1D:FE:12:37:1B)
00:1D:FE:12:37:49 (необходимо сгенерировать 00:1D:FE:12:37:4A)
00:1D:FE:12:37:4F (необходимо сгенерировать 00:1D:FE:12:37:50)

Ограничение здесь заключается в том, что мне нужно запускать этот сценарий на компьютере, на котором нет ни «лишних» модулей perl, ни установленных, ни доступных, поэтому код должен быть включен в сценарий. Это означает, что Net::MAC отсутствует как модуль, но я мог бы потенциально каннибализировать некоторые полезные биты и включить его, но я думаю, что то, что я пытаюсь сделать, не должно быть полностью сложным для реализации в небольшой функции, использующей пакет (? ) или что-то в этом роде.

Я нашел разные темы на форумах, таких как PerlMonks, но, похоже, ни у кого нет окончательного ответа. Любой вклад будет оценен!

Ответы [ 6 ]

8 голосов
/ 15 апреля 2011

Это 48-битное число.Разобрать, увеличить, отформатировать.

Многие сборки Perl поддерживают только 32-битные числа в виде целых чисел, поэтому я не буду формировать большие целые числа.

my $mac_str = '00:1D:FE:12:37:1A';

( my $mac_hex = $mac_str ) =~ s/://g;
my ($mac_hi, $mac_lo) = unpack("nN", pack('H*', $mac_hex));

if ($mac_lo == 0xFFFFFFFF) {
    $mac_hi = ($mac_hi + 1) & 0xFFFF;
    $mac_lo = 0;
} else {
    ++$mac_lo;
}

$mac_hex = sprintf("%04X%08X", $mac_hi, $mac_lo);
$mac_str = join(':', $mac_hex =~ /../sg);
1 голос
/ 15 апреля 2011

Я не знаю Perl, но я сделал приращение macaddress в Python. Код добавлен здесь

def getmacaddress_increment(macinst, rowindex):
inst = gethex_todecimal(macinst)
macarray = inst.split('.')
instarr = []
seg5 = int(macarray[5]) + rowindex       
if seg5 > 255:
    macarray[5] = str(seg5%255)
    seg4 = int(macarray[4])
    macarray[4] = str(seg4 + int(seg5/255))
else:
    macarray[5] = str(seg5)

seg4 = int(macarray[4])           
if seg4 > 255:
    macarray[4] = str(seg4%255)
    seg3 = int(macarray[3])
    macarray[3] = str(seg3 + int(seg4/255))
else:
    macarray[4] = str(seg4)

seg3 = int(macarray[3])           
if seg3 > 255:
    macarray[3] = str(seg3%255)
    seg2 = int(macarray[2])
    macarray[2] = str(seg2 + int(seg3/255))
else:
    macarray[3] = str(seg3)

seg2 = int(macarray[2])
if seg2 > 255:
    macarray[2] = str(seg2%255)
    seg1 = int(macarray[1])
    macarray[1] = str(seg1 + int(seg2/255))

seg1 = int(macarray[1])
if seg1 > 255:
    macarray[1] = '0'
    seg0 = int(macarray[0])
    macarray[0] = str(seg0 + 1)

seg0 = int(macarray[0])
if seg0 > 255:
    macarray[0] = '0'
arr = []
#newval = macarray[0] + '.' + macarray[1] + '.' + macarray[2] + '.' + macarray[3] + '.' + macarray[4] + '.' + macarray[5]        
#print 'Updated value: ', newval
for cnt, instr in enumerate(macarray):
   arr.append("%0.2x" % int(instr))
return ':'.join(arr)

def toint(macid):   
    return str(int(macid, 16))

def gethex_todecimal(macaddr):
   macaddr = macaddr.replace('-', ':')
   inst = map(toint, macaddr.split(':'))
   return '.'.join(inst)

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

Сива

0 голосов
/ 11 марта 2014

Ruby:

def gen_next_mac(base_mac, rowindex) mac_ints = base_mac.split(':').map {|s| s.to_i(16).to_s(10).to_i} mac_ints[5] += rowindex if mac_ints[5] > 255 mac_ints[5] = mac_ints[5]%255 mac_ints[4] = mac_ints[4] + mac_ints[5]/255 end if mac_ints[4] > 255 mac_ints[4] = mac_ints[4]%255 mac_ints[3] = mac_ints[3] + mac_ints[4]/255 end if mac_ints[3] > 255 mac_ints[3] = mac_ints[3]%255 mac_ints[2] = mac_ints[2] + mac_ints[3]/255 end if mac_ints[2] > 255 mac_ints[2] = mac_ints[2]%255 mac_ints[1] = mac_ints[1] + mac_ints[2]/255 end if mac_ints[1] > 255 mac_ints[1] = mac_ints[1]%255 mac_ints[0] = mac_ints[0] + mac_ints[1]/255 end return mac_ints.map {|i| '%02x' %i }.join(':') end

0 голосов
/ 13 декабря 2011

Увеличение MAC-адреса на 1:

#!/bin/sh

mac=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f1-5)

maclast=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f6)

echo "Mac address= $mac:$maclast" 

hexmac=$(echo "ibase=16; $maclast"|bc)

incout=`expr $hexmac + 1 `

macinc=$(echo "obase=16; $incout"|bc)

echo "Mac address= $mac:$macinc"

ВЫВОД:

Mac address= 00:19:D1:F6:F7:F1
Mac address= 00:19:D1:F6:F7:F2
0 голосов
/ 13 декабря 2011

Здесь я использую код для увеличения MAC-адреса, но в последней позиции, когда мы увеличиваем MAC-адрес, он переполняется, поэтому я использовал код, начинающийся с 00

например: если последняя позиция FF, то она начинается с 00

#!/bin/sh
mac=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f1-5)
maclast=$(ifconfig eth0|grep HWaddr|awk '{print $5}'| tr '[a-z]' '[A-Z]' | cut -d ':' -f6)
echo "Mac address= $mac:$maclast"
decmac=$(echo "ibase=16; $maclast"|bc)
echo $decmac
if [ $decmac -eq '241' ]
then
    macinc='00'
else
    incout=`expr $decmac + 1 `
    macinc=$(echo "obase=16; $incout"|bc)
fi
echo "Mac address= $mac:$macinc"

ВЫВОД:

Mac-адрес = 00: 19: D1: F6: F7: FF

Mac-адрес = 00: 19: D1: F6: F7: 00

0 голосов
/ 15 апреля 2011

Скачайте Net :: Mac и вставьте его в свой скрипт как модуль

/tydel.pl
         /Net
             /Mac.pl
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...