Как создать UUID в bash?

В Java можно создать произвольный UUID :

UUID uuid = UUID.randomUUID ();

Как это сделать в Bash?

160 голосов | спросил raoulsson 16 Jpm1000000pmSat, 16 Jan 2010 16:41:43 +030010 2010, 16:41:43

13 ответов


177

См. программу uuidgen, которая является частью пакета e2fsprogs .

В соответствии с этим , libuuid теперь является частью util-linux , и включение в e2fsprogs постепенно прекращается. Однако в новых системах Ubuntu uuidgen теперь находится в пакете uuid-runtime.

Чтобы создать uuid и сохранить его в переменной:

UUID = $ (uuidgen)

В моей системе Ubuntu альфа-символы выводятся как строчные буквы, а в моей системе OS X они выводятся как верхний регистр (спасибо Дэвиду за указание на это в комментарии).

Чтобы переключиться на весь верхний регистр (после его создания, как указано выше):

UUID = $ {UUID ^^}

Чтобы переключиться на все строчные буквы:

UUID = $ {UUID ,,}

Если, например, у вас есть два UUID, и вы хотите сравнить их в Bash, игнорируя их случай, вы можете сделать сравнение стиля tolower () следующим образом:

, если [[$ {uuid1 ,,} == $ {uuid2 ,,}]]
ответил Dennis Williamson 16 Jpm1000000pmSat, 16 Jan 2010 17:01:51 +030010 2010, 17:01:51
123

Чтобы добавить разновидность без добавления внешних зависимостей, в Linux вы можете:

UUID = $ (cat /proc /sys /kernel /random /uuid)

Чтобы распространять неверные методы, на FreeBSD , под уровнем совместимости Linux (linuxulator?),

UUID = $ (cat /compat /linux /proc /sys /kernel /random /uuid)

Литература:

ответил Samveen 7 PM00000040000000231 2013, 16:55:02
27

Просто для полноты ... В Debian также установлен UUID-генератор с пакетом dbus на Debian. Я пропустил это, оглядываясь раньше. Вероятно, это тот же алгоритм, что и пакет e2fsprogs, но он не добавляет тире, поэтому для вас может быть немного более чистым:

$ uuidgen
387ee6b9-520d-4c51-a9e4-6eb2ef15887d

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawity добавляет совет безопасности: «DBU UUID не связаны или не совместимы с RFC 4122 Кроме того, dbus-uuidgen всегда использует временную метку Unix в качестве последних 4 байты, поэтому они могут быть непригодны для некоторых целей ». (Спасибо, Grawity, я должен был заметить это в manpage.)

ответил quack quixote 16 Jpm1000000pmSat, 16 Jan 2010 17:18:57 +030010 2010, 17:18:57
15

Если вы не хотите зависеть от других исполняемых файлов, или вы не можете их использовать, вот чистая версия bash из

ответил noway 22 Mayam14 2014, 01:12:54
13

Я нашел этот скрипт «one-liner» полезным, где uuidgen недоступен. Это также исключает необходимость установки внешних модулей для Perl или Python.

od -x /dev /urandom | head -1 | awk '{OFS = "-"; печать $ 2 $ 3, $ 4, $ 5, $ 6, $ 7 $ 8 $ 9}

Протестировано на SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 и более успешно. Мне любопытно, если это подвержено неединственности, но я не был «бит'тен» за последние 10 лет. Конечно, head -1 можно заменить на head -_other-value_ | tail -1.

Чтобы объяснить,

/dev /random и /dev /urandom являются ядерными генераторами ядра.

od (восьмеричный дамп) имеет шестнадцатеричный выходной переключатель (-x), создающий 16 байтов на строку.

head -n [| tail -1] (где n> 0) извлекает только одну строку предыдущего вывода.

awk устанавливает значение OutputFieldSeparator как дефис везде, где в заявлении печати присутствует запятая. Определяя поля 2-9 независимо, мы управляем дефисами и отключаем счетчик индекса /смещения, который 'od' префикс каждой строки вывода с помощью.

В результате получается шаблон 8-4-4-4-12 символов нижнего регистра a-f0-9.

993bb8d7-323d-b5ee-db78-f976a59d8284
ответил dan 26 AM00000020000004231 2016, 02:57:42
12

Просто, чтобы python не чувствовал себя опущенным:

python -c 'import uuid; print uuid.uuid1 () '
2d96768e-02b3-11df-bec2-001e68b9d147

Чтобы использовать его в оболочке:

myvar = $ (python -c 'import uuid; print uuid.uuid1 ()')

Смотрите UUID документации по Python для типов UUIDS, которые могут быть сгенерированы.

Чтобы сгенерировать файл systemdd, совместимый с машиной, на машине, отличной от systemd, вы можете использовать python для этого:

python -c 'import re; import uuid; print re.sub ("-", "", str (uuid.uuid4 ())) '\
 > /И т.д. /машина-идентификатор
ответил davey 16 Jpm1000000pmSat, 16 Jan 2010 18:26:43 +030010 2010, 18:26:43
11

Perl предоставляет библиотеку UUID на основе пакета e2fsprogs. В моей системе Debian это пакет libuuid-perl. Вот пример однострочного; см. man uuid для более:

$ perl -e 'использовать UUID; UUID :: генерировать ($ UUID); UUID :: unparse ($ uuid, $ string); print "мой новый UUID - $ string \ n"; '
мой новый UUID - 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4

Это было бы тривиально добавить в shellscript с обратными окнами или обозначение $ ():

#! /Bin /Баш
# ... сделать что-нибудь
$ myvar = $ (perl -e 'использовать UUID; UUID :: generate ($ uuid); UUID :: unparse ($ uuid, $ string); print "$ string";')
# ... сделать еще несколько вещей
ответил quack quixote 16 Jpm1000000pmSat, 16 Jan 2010 16:54:30 +030010 2010, 16:54:30
3
apt-get install uuid

Работал для меня, затем id запускал uuid

ответил Joseph 19 J0000006Europe/Moscow 2013, 13:07:13
1

Я написал небольшую функцию Bash с использованием Python для генерации произвольного количества UUID в массе:

# uuid [count]
#
# Сгенерируйте UUID типа 4 (случайный) или UUID типа [count].
функция uuid ()
{
    local count = 1
    если [[ ! -z "$ 1"]]; тогда
        если [["$ 1" = ~ [^ 0-9]]]; тогда
            echo "Использование: $ FUNCNAME [count]"> & 2
            возвращение 1
        фи

        кол = "$ 1"
    фи

    python -c 'import uuid; print ("\ n" .join ([str (uuid.uuid4 ()). upper () для x в диапазоне ('"$ count"')])) '
}

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

python -c 'import uuid; print ("\ n" .join ([str (uuid.uuid4 ()). upper () для x в диапазоне ('"$ count"')])) '

To:

python -c 'import uuid; print ("\ n" .join ([str (uuid.uuid4 ()) для x в диапазоне ('"$ count"')])) '
ответил Will 4 AM00000010000000031 2015, 01:16:00
1

Пожалуйста, посмотрите библиотеку UUID OSSP ( http://www.ossp.org/pkg /lib /uuid /), и подумайте над его установкой. Некоторые проекты предлагают это как вариант (например, PostgreSQL). Он правильно обрабатывает UUID с версией 3 и 5 , что было выше, чем могла обрабатывать моя установленная (например, e2fsprogs) библиотека. К счастью, openSUSE имеет его в одном из основных репозиториев. Получение версии для работы с Windows (например, Cygwin) или MySQL было целым. Похоже, пришло время перейти на Linux /PostgreSQL /Python (и мне так понравился GUI SQLyog для MySQL /MariaDB), так как мне действительно нужны UUID с v3 и v5.

ответил user2351170 24 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 24 Sep 2015 02:37:25 +0300 2015, 02:37:25
1

Я уверен, что некоторые из них прибудут сюда и просто ищут простой способ генерации уникального идентификатора для использования в своих скриптах, и он не обязательно должен быть истинным UUID.

Если это так, вы можете просто сделать следующее, что приведет к созданию уникального идентификатора до второго - так что если вы запустите его несколько раз за секунду, вы все равно получите тот же результат.

MYID = "U $ (date +% s)"
echo $ MYID

будет генерировать идентификаторы, подобные следующим, исходя из текущего системного времени:

  

U1454423662

ПРИМЕЧАНИЕ. Если вы работаете в Linux или у вас установлен Coreutils на Mac, вы можете использовать следующее для создания уникального идентификатора на наносекунду:

MYID = "U $ (дата +% s% N)"
echo $ MYID

, или если вы предпочитаете решение на основе python до наносекунды, которое должно работать почти повсеместно, запустите:

MYUID = U $ (python -c'import time; print repr (time.time ()) ')
echo $ MYUID
ответил Brad Parks 2 FebruaryEurope/MoscowbTue, 02 Feb 2016 17:38:45 +0300000000pmTue, 02 Feb 2016 17:38:45 +030016 2016, 17:38:45
1

Этот поток, с его разнообразными примерами, был действительно полезен для меня. Мне часто нужны функции uuid из нескольких разных сред. И хотя мне нравятся чистые примеры bash, иногда удобнее использовать библиотеку с другого языка.

Итак, для тщательности Ruby (1.9.3+) имеет встроенный модуль SecureRandom, содержащий ряд полезных хэш-функций и id. Из bash cli вы можете это сделать.

ruby ​​-r securerandom -e 'помещает SecureRandom.uuid'
ответил wbr 27 +03002017-10-27T01:37:30+03:00312017bEurope/MoscowFri, 27 Oct 2017 01:37:30 +0300 2017, 01:37:30
0

ran = od -X -A n /dev /random | head -1 | cut -c3-38

corre_id = echo $ {ran} | cut -c1-8 - echo $ {ran} | cut -c10-13 - echo $ {ran} | cut -c14-17 - echo $ {ran} | cut -c19-22 - echo $ {ran} | cut -c23-26``echo $ {ran} | cut -c28-35

ответил andyfff 18 J0000006Europe/Moscow 2018, 14:18:13

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132