다음과 같은 방법으로 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
- 첫 번째 바이트를 추출합니다(
07
예와 같이). - 비트 AND 십진수 254(11111110 - 비트 0을 제외한 모든 비트가 설정됨)
- 10진수 2를 사용한 비트별 OR(00000010 - 비트 1만 설정됨)
- 첫 번째 바이트를 마지막 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
07
16진수는 00000111
2진수입니다. 비트 AND 254
( 11111110
이진수) 의 결과는 00000110
이진수(10진수 6)입니다. (이진) 과의 2
비트 OR 연산은 00000010
비트 1이 이미 설정되어 있으므로 변경되지 않습니다. 최종 결과는 06
16진수입니다.