bash 셸을 사용하여 유효한 임의의 MAC 주소를 생성하는 방법 할 수 있습니까? 주소의 전반부는 항상 이렇습니다 00-60-2F-xx-xx-xx x

bash로 유효한 임의의 mac 주소를 어떻게 생성 할 수 있습니까?

주소의 전반부는 항상 이렇습니다

00-60-2F-xx-xx-xx

x 값만 무작위로 생성해야합니까?



답변

여기 물고기가 있습니다.

이 셸 스크립트는 원하는 임의의 문자열을 생성합니다.

#!/bin/bash
hexchars="0123456789ABCDEF"
end=$( for i in {1..6} ; do echo -n ${hexchars:$(( $RANDOM % 16 )):1} ; done | sed -e 's/\(..\)/-\1/g' )
echo 00-60-2F$end

여기에 커맨드 라인에서 실행하는 방법을 보여주는 무언가가 있었지만 Dennis Williamson의 복잡한 솔루션을 살펴본 후에 사람들이 기대하는 대답은 그들이 할 일이없는 대답이라는 것을 알았습니다. 그들 자신.


답변

과거에는 다음을 사용 하여이 작업을 수행했습니다.

echo 00-60-2F-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]

그러나 그것은 0-9 범위에서만 만들 것입니다. 내 목적으로는 충분했다.

아마도 더 나은 해결책은 printf를 사용하는 것입니다.

printf '00-60-2F-%02X-%02X-%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]

작동 방식은 다음과 같습니다.

  • printf 프로그램은 C “printf”함수를 기반으로합니다.이 함수는 “형식 문자열”을 첫 번째 매개 변수로 사용하고 추가 매개 변수는 형식 문자열을 채 웁니다.
  • 형식화 문자열에 %는 인수 형식화 방법을 알려주는 하나 이상의 문자 일 수있는 “형식 지정자”를 소개합니다.
  • 형식 지정자에서 선행 0은 결과 숫자 출력이 지정된 폭까지 선행 0으로 채워 져야 함을 의미합니다.
  • 2는 지정자가 너비에 해당하는 두 문자를 차지하도록 표시되어야한다고 말합니다.
  • X는 지정자를 끝내고 숫자로 해석되고 16 진수로 표시되어야 함을 나타냅니다. 대문자이므로 문자 af는 대문자 여야합니다.
  • \ n은 줄 바꿈입니다. printf는 백 슬래시를 이스케이프 코드로 해석하여 다른 문자를 표시하는 데 사용할 수 있습니다.
  • 형식 지정자의 나머지 문자는 문자 그대로 인쇄되며 여기에는 초기 “00-06-2F-“및 형식 지정자 사이의 대시가 포함됩니다.
  • 나머지 인수는 쉘 변수 대체 ($로 표시)이며 난수 (RANDOM) 모듈로 256 인 수학 표현식을 포함합니다. 이로 인해 0과 255 사이의 난수가 발생합니다.

답변

  1. 다음과 같이 적절한 크기의 int를 생성하십시오. http://tldp.org/LDP/abs/html/randomvar.html
  2. 다음과 같이 16 진수로 변환 하십시오 : http://snipplr.com/view/2428/convert-from-int-to-hex/
  3. 무작위로 생성 된 3 개의 청크 사이에 대시를 추가하십시오
#!/bin/bash
RANGE=255
#set integer ceiling

number=$RANDOM
numbera=$RANDOM
numberb=$RANDOM
#generate random numbers

let "number %= $RANGE"
let "numbera %= $RANGE"
let "numberb %= $RANGE"
#ensure they are less than ceiling

octets='00-60-2F'
#set mac stem

octeta=`echo "obase=16;$number" | bc`
octetb=`echo "obase=16;$numbera" | bc`
octetc=`echo "obase=16;$numberb" | bc`
#use a command line tool to change int to hex(bc is pretty standard)
#they're not really octets.  just sections.

macadd="${octets}-${octeta}-${octetb}-${octetc}"
#concatenate values and add dashes

echo $macadd
#echo result to screen
#note: does not generate a leading zero on single character sections.  easily remediedm but that's an exercise for you

또는 파이썬에서 :

from random import randint
def gen_mac_char():
  return hex((randint(0,16))).split('x')[1]
def gen_mac_pair():
  return ''.join([gen_mac_char(), gen_mac_char()])
def gen_last_half_mac(stem):
  return '-'.join([stem, gen_mac_pair(), gen_mac_pair(), gen_mac_pair()])
print(gen_last_half_mac('00-60-2F'))

파이썬 버전은 16 개의 와이드 필드 만 사용하여 16 진 문자를 생성하므로 주석 처리를 위해 수정 된 접근 방식을 사용할 필요가 없습니다.


답변

표준 도구를 사용하여

# output in capitals
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random

또는

# output in lower case letters
echo 00-60-2f$(od -txC -An -N3 /dev/random|tr \  -)

가장 짧을 수도 있습니다.


답변

#!/bin/bash
LC_CTYPE=C
MAC=00-60-2F
for i in {1..3}
do
    IFS= read -d '' -r -n 1 char < /dev/urandom
    MAC+=$(printf -- '-%02x\n' "'$char")
done
printf '%s\n' "$MAC"

이것이 작동하는 방식의 열쇠 :

  • LC_CTYPE=C -0x7F보다 큰 문자 허용
  • IFS=\t(탭), \n(줄 바꾸기) 및 공백의 해석을 비활성화 합니다
  • -d ''-개행 가능
  • -r허용합니다 \(거의 항상 습관으로 사용해야합니다 read)
  • 형식 지정자를 사용 -%02x\n하면 출력이 리터럴 하이픈 다음에 선행 0을 포함하는 두 자리 16 진 숫자 (해당되는 경우)가됩니다. 줄 바꿈은 여기서 불필요하며 생략 할 수 있습니다.
  • 는 0에서 255 사이 read의 단일 바이트 ( -n 1)를 가져옵니다 /dev/urandom( 00~ FF).
  • printf루프에서 마지막 인수의 작은 따옴표 는 문자를 숫자 값으로 출력합니다 ( “A”는 “65”로 출력 됨). POSIX 사양을printf 참조하십시오 .

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


답변

내가 얻을 수있는 가장 짧은 방법은 직접 hexdump를 사용하는 것입니다

echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
  • -n3은 16 진법으로 3 바이트를 읽도록 지시합니다.
  • 형식 문자열은 각 바이트에 대해 대시와 두 자리 16 진수 값을 인쇄합니다.
    • ‘/ 1’은 모든 읽기 바이트에 형식을 적용 함을 의미합니다
    • “-% 02X”는 선행 0, 2 자리, 대문자 16 진 값을 인쇄하기위한 printf 사양입니다.
  • / dev / random은 소스 랜덤 바이트입니다.

GNU / Linux에서 테스트


답변

다른 한 줄 솔루션

$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g'

대문자로 같은 것

$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g' | tr '[:lower:]' '[:upper:]'

Bash 환경 변수에 대해 생성

$ export MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g')
$ echo $MAC

세부:

  • od (8 진 덤프)

    -An출력의 선행 주소 표현 (추가 노이즈)을 억제합니다.
    -N3출력을 3 바이트로 제한하십시오.
    -t xC원하는대로 16 진수 ASCII 문자 스타일로 출력합니다.
    /dev/urandom리눅스 커널 난수 의사 파일.

  • sed (스트림 편집기) 공백을 하이픈으로 대체합니다.

    -e <SCRIPT> sed 스크립트를 실행하십시오.

  • tr (문자열 변환)이 예에서는 선택 사항입니다. 스크립트 / 환경에서 대문자 MAC 주소가 마음에 듭니다.