Como criar um UUID no bash?

163

Em Java, é possível criar um UUID aleatório:

UUID uuid = UUID.randomUUID();

Como fazer isso no Bash?

    
por raoulsson 16.01.2010 / 14:41

14 respostas

189

Veja o programa uuidgen que faz parte do pacote e2fsprogs .

De acordo com this , libuuid agora faz parte de util-linux e a inclusão no e2fsprogs está sendo eliminada. No entanto, em novos sistemas Ubuntu, uuidgen está agora no pacote uuid-runtime .

Para criar um uuid e salvá-lo em uma variável:

uuid=$(uuidgen)

No meu sistema Ubuntu, os caracteres alfabéticos são exibidos em letra minúscula e no sistema OS X, eles são exibidos em letras maiúsculas (graças a David por apontar isso em um comentário).

Para alternar para maiúsculas (depois de gerá-lo como acima):

uuid=${uuid^^}

Para alternar para todas as letras minúsculas:

uuid=${uuid,,}

Se, por exemplo, você tem dois UUIDs e deseja compará-los no Bash, ignorando o caso deles, é possível fazer uma comparação tolower() style assim:

if [[ ${uuid1,,} == ${uuid2,,} ]]
    
por 16.01.2010 / 15:01
130

Para adicionar variedade sem adicionar dependências externas, no Linux você pode fazer:

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

Para propagar práticas ruins, no FreeBSD , sob a camada de compatibilidade do linux (linuxulator?),

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

Referências:

por 07.08.2013 / 14:55
28

Apenas por questões de integridade ... Há também um gerador UUID instalado com o pacote dbus no Debian. Eu perdi olhando em volta mais cedo. É provavelmente o mesmo algoritmo do pacote e2fsprogs, mas não adiciona os traços, por isso pode ser um pouco mais limpo para você:

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

O Grawity adiciona uma dica de segurança: "As UUIDs do DBus não estão relacionadas ou são compatíveis com RFC 4122 . O dbus-uuidgen sempre usa o timestamp do Unix como os 4 últimos bytes, então eles podem ser inadequados para alguns usos " (Obrigado, Grawity, eu deveria ter visto isso na manpage).

    
por 16.01.2010 / 15:18
15

Se você não quer depender de outros executáveis, ou não pode usá-los, aqui está a versão pura do aqui aqui aqui :

# Generate a pseudo UUID
uuid()
{
    local N B T

    for (( N=0; N < 16; ++N ))
    do
        B=$(( $RANDOM%255 ))

        if (( N == 6 ))
        then
            printf '4%x' $(( B%15 ))
        elif (( N == 8 ))
        then
            local C='89ab'
            printf '%c%x' ${C:$(( $RANDOM%${#C} )):1} $(( B%15 ))
        else
            printf '%02x' $B
        fi

        for T in 3 5 7 9
        do
            if (( T == N ))
            then
                printf '-'
                break
            fi
        done
    done

    echo
}

[ "$0" == "$BASH_SOURCE" ] && uuid
    
por 21.05.2014 / 23:12
14

Eu encontrei este script "one-liner" útil onde uuidgen não está disponível. Isso também ignora qualquer necessidade de instalar módulos externos para Perl ou Python.

od -x /dev/urandom | head -1 | awk '{OFS="-"; print $2$3,$4,$5,$6,$7$8$9}'

Testado no SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 e mais recente com sucesso. Eu estou curioso para saber se isso é propenso a não-singularidade, mas eu não tenho sido 'bit'ten nos últimos 10 anos. É claro que head -1 pode ser substituído por head -_other-value_ | tail -1 também.

Para explicar,

/dev/random e /dev/urandom são geradores aleatórios do kernel.

od (octal dump) tem um comutador de saída hexadecimal (-x) produzindo 16 bytes por linha.

head -n [| tail -1] (onde n > 0) extrai apenas uma linha da saída anterior.

awk define o OutputFieldSeparator como um hífen em todos os lugares em que uma vírgula ocorre na instrução print. Especificando os campos 2-9 de forma independente, controlamos os hífens e retiramos o contador index / offset que 'od' prefixa cada linha de saída com.

O resultado é um padrão de 8-4-4-4-12 caracteres minúsculos a-f0-9 .

993bb8d7-323d-b5ee-db78-f976a59d8284
    
por 26.08.2016 / 01:57
13

Apenas para que o Python não se sinta excluído:

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

Para usá-lo no shell:

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

Consulte o UUID da Documentação em Python para os tipos de UUIDS que podem ser gerados.

Para gerar um arquivo compatível com id de máquina e systemd em uma máquina não-systemd, você poderia usar o python para fazer desta forma:

python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
 > /etc/machine-id
    
por 16.01.2010 / 16:26
11

O Perl fornece uma biblioteca UUID baseada no pacote e2fsprogs . No meu sistema Debian é o pacote libuuid-perl . Aqui está um exemplo de uma linha; veja man uuid para mais:

$ perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "my new UUID is $string \n";'
my new UUID is 3079e9ce-41d4-4cf3-9f90-d12f8bb752e4

Isso seria trivial para adicionar um shellscript com backticks ou $() notation:

#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "$string";')
# ...do some more stuff
    
por 16.01.2010 / 14:54
3
apt-get install uuid

Trabalhei para mim e, em seguida, o id executou uuid

    
por 19.06.2013 / 11:07
1

Eu escrevi uma pequena função Bash usando Python para gerar um número arbitrário de UUIDs em massa:

# uuid [count]
#
# Generate type 4 (random) UUID, or [count] type 4 UUIDs.
function uuid()
{
    local count=1
    if [[ ! -z "$1" ]]; then
        if [[ "$1" =~ [^0-9] ]]; then
            echo "Usage: $FUNCNAME [count]" >&2
            return 1
        fi

        count="$1"
    fi

    python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'
}

Se você preferir minúsculas, mude:

python -c 'import uuid; print("\n".join([str(uuid.uuid4()).upper() for x in range('"$count"')]))'

Para:

python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
    
por 04.08.2015 / 00:16
1

Por favor, olhe na biblioteca OSSP UUID ( link ), e considere instalá-lo. Alguns projetos oferecem isso como uma opção (por exemplo, PostgreSQL). Ele lida corretamente com os UUIDs da versão 3 e da versão 5 , que estavam além do que minha biblioteca instalada (por exemplo, e2fsprogs) poderia manipular. Felizmente, o openSUSE o possui em um dos principais repositórios. Obter uma versão para funcionar com Windows (por exemplo, Cygwin) ou MySQL tem sido um mangual. Parece que é hora de mudar para o Linux / PostgreSQL / Python (e eu amei a GUI do SQLyog para o MySQL / MariaDB) já que eu realmente preciso dos UUIDs v3 e v5.

    
por 24.09.2015 / 01:37
1

Tenho certeza de que alguns chegarão aqui e estarão apenas procurando uma maneira fácil de gerar uma ID exclusiva para uso em seus scripts e não precisa ser um verdadeiro UUID.

Se sim, você pode apenas fazer o seguinte, o que gerará um ID único até o segundo - por isso, se você executar isso várias vezes em um segundo, ainda obterá o mesmo resultado.

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

gerará ids como os seguintes com base na hora atual do sistema:

U1454423662

NOTA: Se você está no Linux ou tem o Coreutils instalado em um mac, então você pode usar o seguinte para gerar um id único para o nanossegundo:

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

ou se você preferir uma solução baseada em python até o nanossegundo, que deve funcionar em quase todos os lugares, execute:

MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
    
por 02.02.2016 / 15:38
1

Este tópico, com seus variados exemplos, foi muito útil para mim. Eu frequentemente preciso de funções uuid de vários ambientes diferentes. E apesar de adorar os exemplos puramente básicos, às vezes é mais conveniente usar uma biblioteca de um idioma diferente.

Portanto, apenas para a perfeição, o ruby (1.9.3+) possui o módulo SecureRandom integrado, contendo várias funções úteis de hash e id. Do bash cli, você pode fazer isso.

ruby -r securerandom -e 'puts SecureRandom.uuid'
    
por 27.10.2017 / 00:37
0

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

correlation_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

    
por 18.06.2018 / 13:18
-1

Se você estiver usando o Java 10.

$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
    
por 12.09.2018 / 07:43