답변:
여기 물고기가 있습니다.
이 셸 스크립트는 원하는 임의의 문자열을 생성합니다.
#!/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]
작동 방식은 다음과 같습니다.
#!/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 진 문자를 생성하므로 주석 처리를 위해 수정 된 접근 방식을 사용할 필요가 없습니다.
00-60-2F-8B-5-2C
, 00-60-2F-A-71-97
, 00-60-2F-82-F1-4
.
표준 도구를 사용하여
# 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 진 숫자 (해당되는 경우)가됩니다. 줄 바꿈은 여기서 불필요하며 생략 할 수 있습니다.read
의 단일 바이트 ( -n 1
)를 가져옵니다 /dev/urandom
( 00
~ FF
).printf
루프에서 마지막 인수의 작은 따옴표 는 문자를 숫자 값으로 출력합니다 ( "A"는 "65"로 출력 됨). POSIX 사양을printf
참조하십시오 .
선행 문자가 작은 따옴표 또는 큰 따옴표 인 경우 값은 작은 따옴표 또는 큰 따옴표 뒤에 오는 문자의 기본 코드 세트의 숫자 값이어야합니다.
IFS= read …
00에 09 0A 20 (보통 IFS의 문자를) 접는 피하기 위해
-d ''
. 나는 대답을 고칠 것이다. 알려 줘서 고마워.
-r
합니다.`\`을 (를) 보호합니다. 셸 프로그램에서 이진 데이터를 올바르게 처리하지 않았 으면 좋겠습니다. ☺ 문자열 중간에 정확하게 00을 나타내는 것은 불가능한 것 같습니다. 한 번에 한 문자 씩 방법은 read
문자열 보간과 printf
한 문자 인수를 처리하는 방법 사이의 편리한 (설계된) 협력 덕분에 00을 처리합니다 '
. 한숨.
내가 얻을 수있는 가장 짧은 방법은 직접 hexdump를 사용하는 것입니다
echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
GNU / Linux에서 테스트
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
조금 짧습니다 :-)
다른 한 줄 솔루션
$ 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 주소가 마음에 듭니다.
#!/bin/bash
#Creates an array containing all hexadecimal characters
HEX=(a b c d e f 0 1 2 3 4 5 6 7 8 9)
#Defines MAC string length as 0 (total SL will be 17)
SL=0
#Loop sequentially assigns random hex characters in pairs until a full
#MAC address is generated.
while [ $SL -lt 17 ]
do
num=`shuf -i 0-15 -n 1` #Generates random number which will be used as array index
RMAC="$RMAC""${HEX[$num]}" #Uses the randomly generated number to select a hex character
num=`shuf -i 0-15 -n 1` #New random number
RMAC="$RMAC""${HEX[$num]}" #Appends second hex character
SL=$[`echo $RMAC | wc -c` - 1] #Calculates SL and stores in var SL
if [ $SL -lt 17 ] #If string is uncomplete, appends : character
then
RMAC=""$RMAC":"
fi
done
echo $RMAC #Displays randomly generated MAC address
end=$( echo $RANDOM | openssl md5 | sed 's/\(..\)/\1-/g' | cut -b-8 )
echo 00-60-2f-$end
이것도 잘 작동합니다. 필요에 따라 출력은 모두 대문자입니다.
openssl rand -hex 3 | sed 's/\(..\)\(..\)\(..\)/00-60-2F-\1-\2-\3/' | tr [a-f] [A-F]
이것은 고전적인 쉘 ( #!/bin/sh
) 스크립트 에서 작동합니다 :
random_mac() {
printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -6
}
또는 사용자 정의 접두사를 원할 경우 :
random_mac_with_prefix() {
echo -n "00:60:2f:" &&
printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -3
}
사용법 예 :
$ random_mac
96:ef:45:28:45:25
$ random_mac
7e:47:26:ae:ab:d4
$ random_mac_with_prefix
00:60:2f:24:f4:18
$ random_mac_with_prefix
00:60:2f:63:08:b2
다른 옵션은 다음을 사용하는 것입니다 jot
.
echo 00-60-2F-$(jot -w%02X -s- -r 3 0 256)
-w
형식을 -s
변경하고 구분 기호를 변경하며 -r
난수를 생성합니다.
od
artistoex 및 zero2cx에 의해 게시 된 답변에 사용되는 명령 은 OS X의 출력에 대시를 추가 od
하지만 다음과 같은 것은 아닙니다.
echo 00-60-2f-$(od -tx1 -An -N3 /dev/random|awk '$1=$1'|tr \ -)
OS X od
( /usr/bin/od
아래)은 GNU와 다른 출력 형식을 사용합니다 od
.
$ /usr/bin/od -N3 -tx1 -An /dev/random|tr ' ' -
-----------c7--fd--55----------------------------------------------------
$ god -N3 -tx1 -An /dev/random|tr ' ' -
-94-9e-5c
jot -w%02X -s- -r 3 1 256
하기 위해 답을 편집했습니다 jot -w%02X -s- -r 3 0 256
.
리눅스에서 :
printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
설명:
Linux에서는 읽을 때마다 /proc/sys/kernel/random/uuid
새로운 유형 4 (임의의) UUID를 반환 합니다. 대부분의 문자는 (의사) 임의의 16 진 숫자이므로 사용할 수 있습니다. 예 :
$ cat /proc/sys/kernel/random/uuid
5501ab12-b530-4db5-a8ea-3df93043f172
$ # ^ ^ Beware, these characters are not random.
$ # ^^^^^ ^^^ Let's use characters on these positions.
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
6d-74-a1
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
13-f9-75
이제 00-60-2f-
(줄 바꿈없이) 먼저 인쇄하면 충분합니다 .
$ printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
00-60-2f-86-f9-21
장점 :
printf
및 cut
POSIX 도구입니다;단점 :
/proc/sys/kernel/random/uuid
일부 시스템에서는 사용하지 못할 수 있습니다.
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'