Как генерировать допустимый случайный MAC-адрес с оболочкой удара

Как я могу генерировать допустимый случайный адрес Mac с ударом.

Первая половина адреса должна всегда оставаться то же как это

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

просто значение x должно быть сгенерировано случайное?

16
задан 07.09.2012, 13:02

4 ответа

Вот рыба.

Этот сценарий оболочки генерирует случайную строку, которую Вы ищете:

#!/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) решение я вижу, что ответ, который ожидают люди, является тем, где они не должны делать никакого, работают сами.

18
ответ дан 07.12.2019, 10:43
#!/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 заставляет вывод быть литеральным дефисом, сопровождаемым двухразрядным шестнадцатеричным числом включая начальный нуль, при необходимости. Новая строка является лишней здесь и могла быть опущена.
  • read получает единственный байт (-n 1) от /dev/urandom в диапазоне от 0 до 255 (00 кому: FF).
  • Одинарная кавычка в последнем аргументе printf в причинах цикла символ, который будет произведен как его числовое значение ("A" производится как "65"). Посмотрите спецификацию POSIX для printf где это говорит:

    Если начальный символ будет одинарной кавычкой или двойной кавычкой, то значение должно быть числовым значением в базовом кодовом наборе символа после одинарной кавычки или двойной кавычки.

7
ответ дан 07.12.2019, 10:43

В прошлом я сделал это использование:

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) в спецификаторе формата означает, что получающийся числовой вывод должен быть дополнен начальными нулями до указанной ширины.
  • Эти 2 говорят, что спецификатор должен быть отображен, подняв две ценности символов ширины.
  • X концов спецификатор и обозначает, что должен быть интерпретирован как число и отображен как шестнадцатеричный. Поскольку это является прописным, буквы a-f должны быть верхним регистром.
  • \n является новой строкой - printf, интерпретирует обратную косую черту как управляющий код, который может использоваться для отображения других символов, часто хитрых символов как новая строка.
  • Оставшиеся символы в спецификаторе формата распечатываются буквально, это включает начальную букву "00-06-2F-" и тире между спецификаторами формата.
  • Остающиеся аргументы являются подстановками переменных оболочки (обозначенный $) и включают математическое выражение, которое является случайным числом (СЛУЧАЙНЫЕ) 256 по модулю. Это приводит к случайному числу между 0 и 255.
16
ответ дан 07.12.2019, 10:43
  1. Генерируйте соответственно размерный интервал как так: http://tldp.org/LDP/abs/html/randomvar.html
  2. Преобразуйте в шестнадцатеричное число как так: http://snipplr.com/view/2428/convert-from-int-to-hex/
  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

Или в 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 широких полей для генерации шестнадцатеричного символа, таким образом, Вы не должны волноваться о нулевом дополнении - подход, исправленный для обращения к комментарию.

17
ответ дан 07.12.2019, 10:43

Теги

Похожие вопросы