it-swarm.com.de

Wie erstelle ich eine UUID in Bash?

In Java ist es möglich, eine zufällige UUID zu erstellen:

UUID uuid = UUID.randomUUID();

Wie geht das in Bash?

185
raoulsson

Siehe das Programm uuidgen, das Teil des Pakets e2fsprogs ist.

Laut this ist libuuid jetzt Teil von til-linux und die Aufnahme in e2fsprogs wird schrittweise eingestellt. Auf neuen Ubuntu-Systemen befindet sich uuidgen jetzt im Paket uuid-runtime.

So erstellen Sie eine UUID und speichern sie in einer Variablen:

uuid=$(uuidgen)

Auf meinem Ubuntu-System werden die Alpha-Zeichen in Kleinbuchstaben und auf meinem OS X-System in Großbuchstaben ausgegeben (danke an David, der in einem Kommentar darauf hingewiesen hat).

So wechseln Sie zu Großbuchstaben (nachdem Sie sie wie oben generiert haben):

uuid=${uuid^^}

So wechseln Sie zu Kleinbuchstaben:

uuid=${uuid,,}

Wenn Sie beispielsweise zwei UUIDs haben und diese in Bash vergleichen möchten, ohne deren Groß- und Kleinschreibung zu beachten, können Sie einen Vergleich im Stil tolower() wie folgt durchführen:

if [[ ${uuid1,,} == ${uuid2,,} ]]

Um Abwechslung hinzuzufügen, ohne externe Abhängigkeiten hinzuzufügen, können Sie unter Linux Folgendes tun:

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

Um schlechte Praktiken auf FreeBSD unter der Linux-Kompatibilitätsschicht (Linuxulator?) Zu verbreiten,

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

Verweise:

167
Samveen

Der Vollständigkeit halber ... Auf Debian ist auch ein UUID-Generator mit dem Paket dbus installiert. Ich habe es vermisst, mich früher umzusehen. Es ist wahrscheinlich der gleiche Algorithmus wie das e2fsprogs-Paket, fügt jedoch keine Bindestriche hinzu, sodass es für Sie möglicherweise etwas sauberer ist:

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawity fügt einen Sicherheitstipp hinzu: "DBus-UUIDs sind nicht mit RFC 4122 verwandt oder kompatibel. Außerdem verwendet dbus-uuidgen immer den Unix-Zeitstempel als die letzten 4 Bytes Sie könnten für einige Zwecke ungeeignet sein. " (Danke, Grawity, das hätte ich auf der Manpage sehen sollen.)

34
quack quixote

Wenn Sie nicht von anderen ausführbaren Dateien abhängig sein möchten oder diese nicht verwenden können, finden Sie hier die reine Bash-Version von hier :

# 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
20
noway

Ich habe dieses Skript "Einzeiler" nützlich gefunden, wenn uuidgen nicht verfügbar ist. Dadurch wird auch die Notwendigkeit umgangen, externe Module für Perl oder Python zu installieren.

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

Getestet auf SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 und neuer erfolgreich. Ich bin neugierig, ob dies zu Nicht-Einzigartigkeit neigt, aber ich bin in den letzten 10 Jahren nicht "gebissen" worden. Natürlich könnte head -1 Auch durch head -_other-value_ | tail -1 Ersetzt werden.

Erklären,

/dev/random Und /dev/urandom Sind Kernel-Zufallsgeneratoren.

od (oktaler Speicherauszug) verfügt über einen Hex-Ausgangsschalter (-x), der 16 Bytes pro Zeile erzeugt.

head -n [| tail -1] (wobei n> 0 ist) extrahiert nur eine Zeile der vorherigen Ausgabe.

awk setzt den OutputFieldSeparator als Bindestrich überall dort, wo in der print-Anweisung ein Komma vorkommt. Indem wir die Felder 2 bis 9 unabhängig voneinander angeben, steuern wir die Bindestriche und entfernen den Index-/Versatzzähler, dem jede Ausgabezeile mit 'od' vorangestellt wird.

Das Ergebnis ist ein Muster aus 8-4-4-4-12 Kleinbuchstaben a-f0-9.

993bb8d7-323d-b5ee-db78-f976a59d8284
19
dan

Nur so python fühlt sich nicht ausgelassen:

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

So verwenden Sie es in der Shell:

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

In der Python Documentation UUID finden Sie die Arten von UUIDS, die generiert werden können.

Um eine systemd-Maschinen-ID-kompatible Datei auf einem nicht systemd-Computer zu generieren, können Sie python) folgendermaßen vorgehen:

python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
 > /etc/machine-id
14
davey

Perl bietet eine UUID-Bibliothek basierend auf dem Paket e2fsprogs. Auf meinem Debian-System ist es das libuuid-Perl - Paket. Hier ist ein Beispiel für einen Einzeiler. Weitere Informationen finden Sie unter man uuid:

$ 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

Dies wäre trivial, um ein Shellscript mit Backticks oder der Notation $() hinzuzufügen:

#!/bin/bash
# ...do some stuff
$myvar = $(Perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "$string";')
# ...do some more stuff
11
quack quixote
apt-get install uuid

Hat für mich gearbeitet, dann habe ich uuid ausgeführt

3
Joseph

Ich bin sicher, einige werden hier ankommen und suchen nur nach einer einfachen Möglichkeit, eine eindeutige ID zur Verwendung in ihren Skripten zu generieren, und es muss keine echte UUID sein.

In diesem Fall können Sie einfach Folgendes ausführen, wodurch eine sekundenweise eindeutige ID generiert wird. Wenn Sie diese also innerhalb einer Sekunde mehrmals ausführen, erhalten Sie immer noch das gleiche Ergebnis.

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

generiert IDs wie die folgenden basierend auf der aktuellen Systemzeit:

U1454423662

HINWEIS: Wenn Sie unter Linux arbeiten oder Coreutils auf einem Mac installiert haben, können Sie Folgendes verwenden, um eine eindeutige ID für die Nanosekunde zu generieren:

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

oder wenn Sie eine python-basierte Lösung bis zur Nanosekunde bevorzugen, die fast überall funktionieren sollte, führen Sie Folgendes aus:

MYUID=U$(python -c'import time; print repr(time.time())')
echo $MYUID
1
Brad Parks

Dieser Thread mit seinen vielfältigen Beispielen war für mich sehr nützlich. Ich benötige häufig UUID-Funktionen aus verschiedenen Umgebungen. Und obwohl ich die reinen Bash-Beispiele liebe, ist es manchmal bequemer, eine Bibliothek aus einer anderen Sprache zu verwenden.

Aus Gründen der Gründlichkeit verfügt Ruby (1.9.3+)) über das integrierte SecureRandom-Modul, das eine Reihe nützlicher Hash- und ID-Funktionen enthält. Mit der Bash-CLI können Sie dies tun.

Ruby -r securerandom -e 'puts SecureRandom.uuid'
1
wbr

Bitte schauen Sie sich die OSSP-UUID-Bibliothek an ( http://www.ossp.org/pkg/lib/uuid/ ) und überlegen Sie, sie zu installieren. Einige Projekte bieten es als Option an (z. B. PostgreSQL). Es behandelt UUIDs der Versionen 3 und 5 ordnungsgemäß, was über das hinausging, was meine installierte Bibliothek (z. B. e2fsprogs) verarbeiten konnte. Glücklicherweise hat openSUSE es in einem der Hauptrepos. Es war ein Problem, eine Version mit Windows (z. B. Cygwin) oder MySQL zum Laufen zu bringen. Es scheint an der Zeit zu sein, auf Linux/PostgreSQL/Python umzusteigen (und ich habe die SQLyog-GUI auf MySQL/MariaDB so geliebt), da ich wirklich UUIDs der Versionen 3 und 5 benötige.

1
user2351170

Ich habe eine kleine Bash-Funktion mit Python] geschrieben, um eine beliebige Anzahl von UUIDs in großen Mengen zu generieren:

# 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"')]))'
}

Wenn Sie Kleinbuchstaben bevorzugen, ändern Sie:

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

Zu:

python -c 'import uuid; print("\n".join([str(uuid.uuid4()) for x in range('"$count"')]))'
1
Will
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`
0
andyfff