내 스크립트에서는 MAC 주소를 무작위로 생성해야 합니다. 아래 코드는 더 큰 스크립트에서 추출되었으므로 MAC 주소 계산이 별도의 함수에 있습니다.
이는 아래 코드와 잘 작동합니다. 스크립트를 실행하면 여러 주소를 생성한 후 속도가 크게 느려집니다.
내가 어떻게 할 수있는가속하다유효한 MAC 주소를 생성하시겠습니까?
#!/bin/bash
devicesCSVMacAddress="55:2d:fa:07" # <- fake MAC address prefix
devicesCSVFile=''
function mac_address() {
line=''
# ****************
# This line below when I calculate a random mac address ending seems to be slow
line+=$devicesCSVMacAddress$(od -txC -An -N2 /dev/random|tr \ :)
# ****************
devicesCSVFile+=$line'\n'
date
}
for (( i=0; i<100; i++ ))
do
mac_address
echo $i
done
echo -e $devicesCSVFile > devices.csv
이 답변에 설명된 대로 od 도구를 사용했습니다.Bash 쉘을 사용하여 유효한 임의 MAC 주소를 생성하는 방법.
답변1
사용 /dev/urandom
! 사용해야 할 몇 가지 이유가 있습니다 /dev/random
. /dev/urandom
참조우랜덤에 관한 신화또는/dev/random과 /dev/urandom을 사용하는 경우-- 생성된 숫자를 모든 곳에 게시하는 경우에는 확실히 그렇지 않습니다.
/dev/random
사용 가능한 엔트로피가 충분하지 않으면 엔트로피를 소비하고 차단하고 대기합니다. /dev/urandom
절대 차단하지 마세요.
답변2
이렇게 하면 원하는 무작위성을 유지하면서 중복을 피할 수 있습니다.
prefix='55:2a:fa:07'
while :
do
echo $prefix$(od -txC -An -N2 /dev/urandom | tr ' ' :)
done |
awk '!h[$0]++ {print $0; ONR++} ONR>100 {exit}' >devices.csv
이 awk
구성은 이미 본 행을 추적하고 이전에 본 적이 없는 행만 출력합니다. 100줄을 인쇄하면 종료되고 루프가 중지됩니다.
답변3
그리고 zsh
:
#! /bin/zsh -
prefix=55:2d:fa:07
(){
local LC_ALL=C
IFS= read -ru0 -k2 a < /dev/urandom
printf '%s:%02x:%02x\n' "$prefix" \'${^(s::)a}
}
내장된 기능만 사용됩니다. zsh
특정 기능은 다음과 같습니다.
- (다른 모든 쉘과 달리) 변수에서 NUL 바이트를 처리할 수 있습니다.
(){...}
: 익명 함수(여기서는 LC_ALL의 로컬 범위에서 사용됨)read -k2
: 두 문자를 읽습니다(여기에는 LC_ALL=C인 바이트가 있습니다). 이미 이것 을 위해ksh93
지금 . 키보드 키를 참조하지 말고 ( 와 ) 동일 해야 합니다 .bash
-N
-u0
ksh
-k
(s::)
분할할 매개변수 확장 플래그(여기서는 빈 문자열이므로 단일 문자로 분할됨)$^array
: 이 배열을 할당하여 확장하면 가 됩니다'x 'y
.- 여기서는 문자의 코드 포인트 값을 가져오는 부분을 포함하여 명령
printf
이 표준입니다 .'x