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

Как сократить отображение символов no of для текущего каталога в приглашении
Cygwin-cd в сценарии bash
Почему inotifywait-m работает несколько раз? (бесконечный цикл)
Можете ли вы префикс каждой строки, написанной с tee с текущей датой и временем?
grep: выводить конкретную строку после матча
Экранирование символов для точного условия grep в сценарии Bash
Как мне остановить Git Bash, запрашивающего больше ввода?
в bash: ошибка синтаксиса около неожиданной лексемы `-о'
Создать ярлык для папки с пробелами и дефисами
Циклический перебор подкаталогов и выполнение команды в каждом из них
Bash-скрипт для резервного копирования и восстановления структуры каталогов
Проблемы с запуском скрипта, как хрон
Запуск сценария bash непосредственно перед отключением USB-устройства?
В чем разница между "Shell" и "Terminal"? [дубликат]
Как найти все софт-ссылки (символьные ссылки) в текущем каталоге?

Как создать действительный случайный MAC-адрес с помощью bash shell

Как я могу создать действительный случайный mac-адрес с bash.

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

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

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

5
задан Sathya
источник

13 ответов

вот рыба.

этот скрипт будет генерировать случайную строку искать:

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

У меня здесь было что-то, что показало, как запустить его из командной строки, но, посмотрев на запутанное (но поддержанное) решение Денниса Уильямсона, я вижу, что ответ, который люди ожидают, - это тот, где им не нужно делать какую-либо работу самостоятельно.

16
отвечен deltaray 2010-12-04 21:25:23
источник

в прошлом я делал это с помощью:

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 интерпретирует обратную косую черту как escape-код, который может использоваться для отображения других символов, часто сложных символов, таких как новая строка.
  • остальные символы в спецификаторе формата печатаются буквально, включая начальный "00-06-2F -" и тире между спецификаторами формата.
  • остальные аргументы-shell подстановки переменных (обозначаются$) и включают математическое выражение, которое является случайным числом (RANDOM) по модулю 256. В результате получается случайное число от 0 до 255.
15
отвечен Sean Reifschneider 2011-07-07 01:17:27
источник
  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 широкое поле для создания шестнадцатеричного символа, так что вам не придется беспокоиться около нуля обивка - подход изменен адрес комментарий.

15
отвечен RobotHumans 2015-03-22 04:06:31
источник

используя стандартные инструменты, либо

# 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 \  -)

может быть самым коротким из всех.

9
отвечен artistoex 2012-09-13 09:19:47
источник
#!/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 (tab),\n (перевод строки) и Пробел
  • -d ''- позволяет строки
  • -r позволяет \ (и почти всегда использовать по привычке с read)
  • спецификатор формата -%02x\n выводится буквенным дефисом, за которым следует двузначное шестнадцатеричное число включая ведущий ноль, если это уместно. Новая строка здесь избыточна и может быть опущена.
  • read получает один байт (-n 1) от /dev/urandom в диапазоне от 0 до 255 (00 to FF).
  • одинарная кавычка в последнем аргументе printf в цикле символ выводится как числовое значение ("A" выводится как "65"). Смотрите POSIX спецификация для printf где он говорит:

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

6
отвечен Dennis Williamson 2011-06-27 13:52:07
источник

самый короткий способ, который я мог придумать, - использовать hexdump напрямую

echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
  • -n3 говорит hexdump читать три байта
  • строка форматирования печатает тире и двухзначное шестнадцатеричное значение для каждого байта
    • ' / 1 ' означает применять формат для каждого прочитанного байта
    • "-%02X" - это спецификация printf для печати ведущего нуля, двухзначного шестнадцатеричного значения в верхнем регистре
  • /dev/random источник случайный bytes

протестировано на GNU / Linux

5
отвечен maxthoursie 2012-09-06 09:30:28
источник

еще одна строка решение

$ 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 вывод в hex, ASCII стиле символов, как желательный.

    /dev/urandom Linux ядро случайное число псевдо-файл.

  • sed (stream editor) для подстановки пробела на дефис.

    -e <SCRIPT> выполнить сценарий sed.

  • TR (перевод строки) необязательно, в данном примере. Мне нравятся MAC-адреса в верхнем регистре в моих скриптах / среде.

4
отвечен zero2cx 2012-09-07 04:02:58
источник
#!/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
2
отвечен Haematoma 2012-08-24 23:04:22
источник

Это должно работать

echo 00-60-2f-`openssl rand -hex 3 | sed 's/\(..\)/-/g; s/.$//'`
2
отвечен linuxrules94 2013-09-20 02:01:02
источник
end=$( echo $RANDOM | openssl md5 | sed 's/\(..\)/-/g' | cut -b-8 )
echo 00-60-2f-$end
0
отвечен Kevin Duterne 2011-06-24 21:37:18
источник

другой вариант-использовать jot:

echo 00-60-2F-$(jot -w%02X -s- -r 3 1 256)

-w изменения в формат -s изменяет разделитель и -r генерирует случайные числа.

команды с помощью od в ответах, опубликованных artistoex и zero2cx, добавьте много дополнительных тире в вывод с OS X od, но это не:

echo 00-60-2f-$(od -tx1 -An -N3 /dev/random|awk '='|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
0
отвечен user4669748 2016-05-26 08:14:55
источник

Это одно работает также. Выход все в верхнем регистре по мере необходимости.

openssl rand -hex 3 | sed 's/\(..\)\(..\)\(..\)/00-60-2F---/' | tr [a-f] [A-F]
0
отвечен Jaroslav Kucera 2016-09-07 08:23:51
источник

это работает в классической оболочке (#!/bin/sh) скрипт:

random_mac() {
    printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/:/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/(..)/:/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
0
отвечен kvaps 2017-12-28 15:27:47
источник

Другие вопросы bash mac-address