Как я могу генерировать допустимый случайный адрес 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 (но upvoted) решение я вижу, что ответ, который ожидают люди, является тем, где они не должны делать никакого, работают сами.
#!/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
в причинах цикла символ, который будет произведен как его числовое значение ("A" производится как "65"). Посмотрите спецификацию POSIX для printf
где это говорит:
Если начальный символ будет одинарной кавычкой или двойной кавычкой, то значение должно быть числовым значением в базовом кодовом наборе символа после одинарной кавычки или двойной кавычки.
В прошлом я сделал это использование:
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
Или в Python:
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 широких полей для генерации шестнадцатеричного символа, таким образом, Вы не должны волноваться о нулевом дополнении - подход, исправленный для обращения к комментарию.