유효한 임의 MAC 주소를 생성하는 방법은 무엇입니까?

유효한 임의 MAC 주소를 생성하는 방법은 무엇입니까?

다음과 같은 방법으로 MAC 주소를 생성할 수 있다는 것을 알고 계실 것입니다.

macaddr=$(dd if=/dev/random bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr

하지만 이 방법을 사용하면 다음과 같은 MAC 주소가 생성될 수 있습니다 07:d4:51:9f:50:6c.이 주소는 전혀 사용할 수 없습니다.. 시도하면 다음 오류가 발생합니다.

# ip link set dev wlan0 address $macaddr
RTNETLINK answers: Cannot assign requested address

따라서 위의 줄을 다시 작성해야 합니다. 문제는 MAC 주소가 항상 유효하려면 어떤 모습이어야 하느냐는 것입니다.

답변1

  1. 첫 번째 바이트를 추출합니다( 07예와 같이).
  2. 비트 AND 십진수 254(11111110 - 비트 0을 제외한 모든 비트가 설정됨)
  3. 10진수 2를 사용한 비트별 OR(00000010 - 비트 1만 설정됨)
  4. 첫 번째 바이트를 마지막 5바이트와 결합

예를 들어

#! /bin/sh

mac='07:d4:51:9f:50:6c'

lastfive=$( echo "$mac" | cut -d: -f 2-6 )
firstbyte=$( echo "$mac" | cut -d: -f 1 )

# make sure bit 0 (broadcast) of $firstbyte is not set,
# and bit 1 (local) is set.
# i.e. via bitwise AND with 254 and bitwise OR with 2.

firstbyte=$( printf '%02x' $(( 0x$firstbyte & 254 | 2)) )

mac="$firstbyte:$lastfive"

echo "$mac"

산출:

06:d4:51:9f:50:6c

0716진수는 000001112진수입니다. 비트 AND 254( 11111110이진수) 의 결과는 00000110이진수(10진수 6)입니다. (이진) 과의 2비트 OR 연산은 00000010비트 1이 이미 설정되어 있으므로 변경되지 않습니다. 최종 결과는 0616진수입니다.

관련 정보