Antworten:
Sehen Sie sich das uuidgen
Programm an, das Teil des e2fsprogs- Pakets ist.
Nach diesem , libuuid
ist jetzt Teil von util-linux und die Aufnahme in e2fsprogs wird eingestellt. Allerdings ist auf neuen Ubuntu-Systemen uuidgen
jetzt im uuid-runtime
Paket.
So erstellen Sie eine UUID und speichern sie in einer Variablen:
uuid=$(uuidgen)
Auf meinem Ubuntu-System werden die Buchstaben als Kleinbuchstaben und auf meinem OS X-System als Großbuchstaben ausgegeben (danke an David, der dies in einem Kommentar hervorgehoben hat).
So wechseln Sie in Großbuchstaben (nach dem Generieren wie oben):
uuid=${uuid^^}
So wechseln Sie zu Kleinbuchstaben:
uuid=${uuid,,}
Wenn Sie zum Beispiel zwei UUIDs haben und diese in Bash vergleichen möchten, ohne die Groß- und Kleinschreibung zu beachten, können Sie einen tolower()
Stilvergleich wie folgt durchführen:
if [[ ${uuid1,,} == ${uuid2,,} ]]
echo -e 'f\nF' | grep '[[:xdigit:]]'
beide Zeilen ausgeben). Wenn es eine Rolle für Sie tut , und Sie haben Bash 4, können Sie dies tun , um es tiefer Fall zu machen: uuid=$(uuidgen); uuid=${uuid,,}
oder diese Großbuchstaben zu machen: uuid=$(uuidgen); uuid=${uuid^^}
oder etwas in dieser Richtung eine tun tolower()
Stil - Test:if [[ ${uuid1,,} == ${uuid2,,} ]]
Unter Linux können Sie Folgendes tun, um die Vielfalt zu erhöhen, ohne externe Abhängigkeiten hinzuzufügen :
UUID=$(cat /proc/sys/kernel/random/uuid)
Um schlechte Praktiken unter FreeBSD unter der Linux-Kompatibilitätsebene (linuxulator?) Zu verbreiten,
UUID=$(cat /compat/linux/proc/sys/kernel/random/uuid)
Verweise:
Der Vollständigkeit halber ... Es gibt auch einen UUID-Generator, der mit dem dbus
Paket auf Debian installiert ist . Ich habe es vermisst, als ich mich früher umgesehen habe. Es ist wahrscheinlich derselbe 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. Daher sind sie möglicherweise für einige Verwendungszwecke ungeeignet." (Danke, Grawity, ich hätte das auf der Manpage sehen sollen.)
dbus-uuidgen
immer den Unix-Zeitstempel als die letzten 4 Bytes. Daher sind sie möglicherweise für einige Zwecke ungeeignet.
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
T
Variable kann entfernt werden und die for T
Schleife kann geändert werden in: case $N in 3 | 5 | 7 | 9) printf '-';; esac
(auf Wunsch in getrennten Zeilen).
case
der sowohl die if
Anweisungen als auch die innere for
Anweisung entfernt werden. Es macht den Code viel ordentlicher. Beachten Sie, dass beides B%15
sein sollte B%16
und B%255
sollte B%256
.
source <(curl url)
Ich fand dieses Skript "one-liner" nützlich, 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 zur Nicht-Einzigartigkeit neigt, aber ich bin in den letzten 10 Jahren nicht "gebissen" worden. Könnte natürlich head -1
auch durch ersetzt head -_other-value_ | tail -1
werden.
Erklären,
/dev/random
und /dev/urandom
sind Kernel-Zufallsgeneratoren.
od
(Octal Dump) hat 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
Legt fest, dass der OutputFieldSeparator überall dort, wo in der print-Anweisung ein Komma vorkommt, ein Bindestrich ist. Indem wir die Felder 2 bis 9 unabhängig voneinander angeben, steuern wir die Bindestriche und entfernen den Index- / Versatzzähler, der jeder Ausgabezeile das Präfix "od" voranstellt.
Das Ergebnis ist ein Muster aus 8-4-4-4-12
Kleinbuchstaben a-f0-9
.
993bb8d7-323d-b5ee-db78-f976a59d8284
od -x /dev/urandom | head -1 | awk '{OFS="-"; srand($6); sub(/./,"4",$5); sub(/./,substr("89ab",rand()*4,1),$6); print $2$3,$4,$5,$6,$7$8$9}'
Nur damit Python nicht ausgelassen wird:
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()')
Informationen zu den Arten von UUIDS, die generiert werden können, finden Sie in der UUID der Python-Dokumentation .
Um eine systemd-Rechner-ID-kompatible Datei auf einem Nicht-systemd-Rechner zu generieren, können Sie Python folgendermaßen verwenden:
python -c 'import re; import uuid; print re.sub("-","",str(uuid.uuid4()))' \
> /etc/machine-id
python3 -c "import uuid; print(uuid.uuid4())"
für Python3
Perl stellt eine UUID-Bibliothek bereit, die auf dem e2fsprogs
Paket basiert . Auf meinem Debian-System ist es das libuuid-perl
Paket. Hier ist ein Beispiel für einen Einzeiler. siehe man uuid
für mehr:
$ 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 $()
Notation zu ergänzen :
#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID; UUID::generate($uuid); UUID::unparse($uuid, $string); print "$string";')
# ...do some more stuff
apt-get install uuid
Hat für mich gearbeitet, dann bin ich weggelaufen uuid
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"')]))'
Sehen Sie sich die OSSP-UUID-Bibliothek ( http://www.ossp.org/pkg/lib/uuid/ ) an und installieren Sie sie. Einige Projekte bieten es als Option an (zB PostgreSQL). Die UUIDs von Version 3 und Version 5 wurden ordnungsgemäß verarbeitet , was über das hinausging, was meine installierte Bibliothek (z. B. e2fsprogs) verarbeiten konnte. Glücklicherweise hat openSUSE es in einem der Hauptrepos. Eine Version mit Windows (zB Cygwin) oder MySQL zum Laufen zu bringen, war ein Problem. Anscheinend ist es an der Zeit, auf Linux / PostgreSQL / Python umzusteigen (und ich mochte die SQLyog-GUI für MySQL / MariaDB so sehr), da ich wirklich UUIDs der Versionen 3 und 5 benötige.
-v3 ns:URL custom-data
Seeding-Mechanismus unterstützt.
Ich bin mir sicher, dass einige hier ankommen werden und nur nach einer einfachen Möglichkeit suchen, 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 tun, wodurch eine sekundengenaue ID generiert wird. Wenn Sie diese also mehrmals innerhalb einer Sekunde ausführen, erhalten Sie immer noch dasselbe Ergebnis.
MYID="U$(date +%s)"
echo $MYID
generiert ausgehend von der aktuellen Systemzeit IDs wie die folgenden:
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
mktemp -u
wie in MYID="$(mktemp -u)"
. Wenn Sie es sich leisten können, leere temporäre Dateien bis zum Neustart -u
MYID="$(mktemp)"
Dieser Thread mit seinen vielfältigen Beispielen hat mir wirklich geholfen. Ich benötige häufig UUID-Funktionen aus verschiedenen Umgebungen. Und obwohl ich die reinen Bash-Beispiele liebe, ist es manchmal bequemer, eine Bibliothek in einer anderen Sprache zu verwenden.
Ruby (1.9.3+) verfügt über das integrierte SecureRandom-Modul, das eine Reihe nützlicher Hash- und ID-Funktionen enthält. Von der Bash Cli aus können Sie dies tun.
ruby -r securerandom -e 'puts SecureRandom.uuid'
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`
od -X -A n /dev/random | head -1 | cut -c3-38
gibt das unten an: echo $ x 4151540a 1f7d0bef 8a0725fb d26183a3 uuid = echo ${x} | cut -c1-8
- echo ${x} | cut -c10-13
- echo ${x} | cut -c14-17
- echo ${x} | cut -c19-22
- echo ${x} | cut -c23-26``echo ${x} | cut -c28-35
echo $ uuid 4151540a-1f7d-0bef-8a07-25fbd26183a3
Wenn Sie Java 10 verwenden.
$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();
jshell
verwendet werden können , und nicht als interaktiver Befehl . Das wird im ursprünglichen Beitrag sehr deutlich.
echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Aber es ist viel langatmiger als uuidgen
.
uuid-runtime
ohne ersichtlichen Grund in das Paket ... +1 für Sie)