Linux 명령 줄에서 임의의 MAC 주소를 생성하는 방법


26

Linux 명령 줄에서 임의의 MAC 주소를 어떻게 생성합니까?

Linux 명령 줄에서 일반적으로 사용되는 표준 도구 만 필요한 솔루션을 검색합니다.

MAC 주소는 게스트 KVM에 사용됩니다.

답변:


46

나는 사용한다

macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

이 방법의 장점은 완전히 임의의 숫자에 비해 시스템의 FQDN을 기반으로 MAC 주소를 안정적으로 재생할 수 있다는 것입니다. 02첫 번째 8 진수에 대한 그냥 공급 업체가 제공하는 MAC 주소가 아닌, 그리고 보장이 확실한 것으로한다 "로컬 할당"비트를 설정 당신이하지에서 충돌 진짜 NIC의 MAC 주소를 가진 것이다.

호스트 당 여러 MAC 주소를 생성해야하는 경우 인터페이스를 연결하기 위해 FQDN을 브리지 이름과 연결했습니다. 이것은 다른 NIC에 대한 것들을 널리 퍼뜨리는 데 도움이되었습니다.


재현성 +1 특정 응용 분야에서는 광산보다 훨씬 우수한 방법입니다.
MadHatter는 Monica

고마워요. 재현 할 수 있다는 아이디어가 마음에 듭니다.
Erik Sjölund

또한 같은 맥을 무작위로 두 번 생성 할 가능성이 거의없는 경우에도 Mac 주소 충돌이 없습니다
Petter H

3
대안으로 사용할 수 있습니다tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
그것은 내 스 니펫이하는 것과 완전히 다른 최종 결과를 만들어
낸다는

8

게시 된 스크립트는 훌륭하지만 경고를 추가하고 싶습니다 : Mind the Birthday (paradoxon)!

23 명만 있어도 2 명은 같은 날 생일을 맞을 확률이 이미 50 %라는 사실에서 비롯됩니다.

사용 방법에 따라 시나리오가 다르지만 MACS를 무작위로 생성하면 약 1 백만에서 mac 번호 충돌 가능성은 2 백만에서 40 %이고 이미 87 %입니다!

몇 개만 있으면 괜찮지 만 수백 대의 서버로 서버 팜을 유지 관리 할 때 각각 수십 개의 가상 머신을 호스팅하거나 부기 관리를 위해 일부 db에서 mac을 색인으로 사용하는 경우 고유해야합니다. !


생일 역설에 대한 경고에 감사드립니다! 내 경우에는 약 20 개의 MAC 주소를 생성하므로 위험을 감수합니다.
Erik Sjölund

3
각각 동일한 브로드 캐스트 도메인에서 수십 개의 가상 머신을 호스팅하는 수백 대의 서버를 실행하는 경우 MAC 주소 충돌 위험보다 더 큰 문제가 있습니다.
womble

1
" 23 명만 있어도 2 명은 같은 날 생일을 맞을 확률이 이미 50 %라는 사실에서 비롯된 것입니다. " 23 명 중 2 명이 같은 생일이 아닌 같은 생일 기념일을 가질 확률은 약 50 % 입니다.
Ron Maupin

5
myserver% perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74

아, 스위스 군용 전기 톱이 다시 탄다. 그리고 0.2 버전에서는 첫 번째 옥텟이 02 인 Wumble의 훌륭한 점을 부끄럽게 훔치고 있습니다.

myserver% perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26

고마워 MadHatter, 나는 당신의 두 번째 변종을 시도하고 작동했습니다. 아주 좋아요!
Erik Sjölund

5

이러한 변형도 잘 작동합니다.

더 길게:

openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'

또는 더 짧은 :

openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'

두 변형의 부하 소비는 시간에 따른 빠른 측정에 따라 매우 유사합니다.


안녕하세요 Anthony, openssl rand와 sed를 결합한 다른 변형이 없으므로이 주제의 고유 한 솔루션입니다.
Jaroslav Kucera

사실입니다. fold -w2|paste -sd: -대신에 사용 했습니다 sed. 이 sed솔루션은 친숙한 도구를 사용하므로 기억하기가 더 쉬울 것입니다.
Anthony G-Monica에 대한 정의

첫 번째 명령이 첫 번째 비트를 짝수로 설정하지 않았기 때문에 첫 번째 명령이 작동하지 않는다고 생각합니다!
amrx

안녕하세요 @amrx, MAC의 첫 비트가 짝수 여야합니까? ec11101100 바이너리로 시작하는 서버 중 하나에 NIC가 있습니다 .
Jaroslav Kucera

1
안녕하세요 @JaroslavKucera, 유니 캐스트 MAC 주소는 첫 번째 바이트에서 1의 자리 비트를 설정하지 않아야합니다. 이것이 "그룹"(멀티 캐스트 / 브로드 캐스트) 비트입니다. 고유 한 MAC 주소를 구성하는 경우 첫 번째 바이트에 2의 자리 비트 ( "로컬로 관리되는"비트)를 설정하여 전 세계적으로 고유 한 MAC 주소와 구별해야합니다.
amrx

4

나는이 게시물이 오래되었다는 것을 알고 있지만 OUI로 0x02로 제한되지 않고 암호로 안전한 의사 난수 MAC 주소를 원한다면 다음과 같이 빠른 플랫폼 독립적 생성기가 있습니다.

$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'

2

wombie의 답변을 기반으로 한 또 다른 내용이 있습니다.

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

md5sum을 통해 urandom 출력을 실행할 필요가 없습니다. Aaron Toponce의 답변에 따라 od를 사용할 수 있습니다.
womble

2

다음은 5 가지 다른 옵션이며, 모두 주소가 유니 캐스트인지 멀티 캐스트인지를 나타내는 최상위 바이트의 최하위 비트와 주소가 보편적으로 또는 로컬로 관리됩니다.

jot -w%02X -s: -r 6 1 256
openssl rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \  :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \  :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-

jotOS X 및 BSD와 함께 제공되지만 대부분의 Linux 배포판에는 포함되어 있지 않습니다. 이어 jot -w, 포맷 변경 -s세퍼레이터를 변경하고, -r난수를 생성한다.

odPOSIX에 있지만 hexdump그렇지 않습니다.

OS X od( /usr/bin/od아래)은 GNU와 다른 출력 형식을 사용합니다 od.

$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9

od입력 파일에 대한 인수 뒤에 배치 된 OS X의 옵션은 입력 파일의 이름으로 취급되므로 Aaron Toponce의 답변에있는 명령은 /dev/urandomOS X와 ​​무한정 읽습니다 od.


1

$ FQDN 다음에 $ RANDOM을 추가하면 실행할 때마다 임의의 mac 주소가 제공됩니다. 이것은 스냅 샷 또는 vms 복제본을 사용하여 백업 vms를 생성하려는 사람들에게 특히 유용합니다.

macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

1
$ RANDOM은 bash에서 사용 가능하지만 다른 쉘에서는 사용 가능하지 않을 수 있습니다.
Michael Hampton


0

파이썬 원 라이너 :

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'

0

Bash 4.4.12 (1) 릴리스에 대해 테스트 한 순수한 bash 버전은 다음과 같습니다.

read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"

첫 줄은 6 글자를 읽습니다 /dev/urandom. 그런 다음 C 문자 세트를 사용하여 각 문자의 0으로 채워진 16 진수 값을 콜론으로 구분하여 인쇄하십시오 (개행은 선택 사항이지만 값을 인쇄하는 데 유용합니다).

printf를 사용하여 문자 값 추출은 POSIX printf 문서에 정의되어 있습니다.

선행 문자가 작은 따옴표 또는 큰 따옴표 인 경우 값은 작은 따옴표 또는 큰 따옴표 뒤에 오는 문자의 기본 코드 세트의 숫자 값이어야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.