Відповіді:
Ось риба.
Цей скрипт оболонки генерує випадковий рядок, який ви шукаєте:
#!/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
У мене просто було щось, що показало, як запустити його з командного рядка, але, переглянувши Денніс Вільямсон, згорнуте (але схвалене) рішення, я бачу, що відповідь, яку очікують люди, - це той, де їм не доведеться робити жодної роботи себе.
Раніше я це робив, використовуючи:
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]
Ось як це працює:
%02Xдасть одну велику літеру.
#!/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'))
Зауважте, що версія python використовує лише 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 - дозволяє символи> 0x7FIFS=- вимикає інтерпретацію \t(вкладка), \n(новий рядок) та пробіл-d ''- допускає нові рядки-rдозволяє \(і майже завжди його слід використовувати за звичкою read)-%02x\nпризводить до того, що виведенням є буквальний дефіс з подальшим двозначним шістнадцятковим числом, включаючи нульовий нуль, якщо доречно. Новий рядок тут зайвий і його можна опустити.readОтримує один байт ( -n 1) від /dev/urandomв діапазоні від 0 до 255 ( 00до FF).Одинична цитата в останньому аргументі printfциклу in in викликає виведення символу як його числове значення ("A" виводиться як "65"). Дивіться специфікацію POSIX,printf де зазначено:
Якщо провідним символом є одноцитата або подвійна цитата, значення має бути числовим значенням в базовому кодовому наборі символу, що слідує за одноцитатою або подвійною цитатою.
IFS= read …уникати складання 09 0a та 20 (звичайні символи IFS) у 00.
-d ''. Я виправлю свою відповідь. Дякую що дали мені знати.
-rвипало те , що захищає `\`. Я б хотів, щоб правильне поводження з бінарними даними в оболонкових програмах було не настільки вигадливим. Seems Начебто неможливо точно зобразити 00 посередині рядка. Ваш метод однозначного часу обробляє 00 завдяки зручній (розробленій?) Співпраці між read, строповою інтерполяцією та тим, як printfтрактує аргумент "один символ" '. Зітхнути.
hexdump -C.
Найкоротший спосіб, який я міг придумати, - це безпосередньо використовувати 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 (восьмеричний відвал)
-AnПригнічує подання провідної адреси (додатковий шум) виводу.
-N3Обмежте вихід на три байти.
-t xCВиведіть у шістнадцятковий, ASCII стиль символу, як бажано.
/dev/urandomПсевдофайл випадкового числа ядра Linux.
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
Це має спрацювати
echo 00-60-2f-`openssl rand -hex 3 | sed 's/\(..\)/\1-/g; s/.$//'`
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сценарії shell ( ):
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.
У Linux:
printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
Пояснення:
У Linux /proc/sys/kernel/random/uuidповертає новий тип 4 (випадковий) UUID кожного разу, коли ви читаєте його. Більшість його символів є (псевдо) випадковими шістнадцятковими цифрами, тому ми можемо їх використовувати. Наприклад:
$ 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"'