En Java, il est possible de créer un UUID aléatoire :
UUID uuid = UUID.randomUUID();
Comment faire cela en Bash?
Voir le uuidgen
programme qui fait partie du paquet e2fsprogs .
Selon cela , celalibuuid
fait maintenant partie d' util-linux et l'inclusion dans e2fsprogs est en train de disparaître. Cependant, sur les nouveaux systèmes Ubuntu, uuidgen
est maintenant dans le uuid-runtime
paquet.
Pour créer un uuid et le sauvegarder dans une variable:
uuid=$(uuidgen)
Sur mon système Ubuntu, les caractères alpha sont écrits en minuscule et sur mon système OS X, ils sont en majuscule (merci à David de l'avoir signalé dans un commentaire).
Pour passer à toutes les majuscules (après l'avoir généré comme ci-dessus):
uuid=${uuid^^}
Pour basculer vers tous les minuscules:
uuid=${uuid,,}
Si, par exemple, vous avez deux UUID et que vous voulez les comparer dans Bash, en ignorant leur cas, vous pouvez effectuer une tolower()
comparaison de style comme ceci:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
paquet sans raison apparente ... +1 à vous)echo -e 'f\nF' | grep '[[:xdigit:]]'
génère les deux lignes). Si cela vous importe et que vous avez Bash 4, vous pouvez le faire pour le mettre en minuscule:uuid=$(uuidgen); uuid=${uuid,,}
ou le faire pour le mettre en majuscule:uuid=$(uuidgen); uuid=${uuid^^}
ou quelque chose dutolower()
genre pour faire un test de style:if [[ ${uuid1,,} == ${uuid2,,} ]]
Pour ajouter de la variété sans ajouter de dépendances externes, vous pouvez faire sous Linux :
Pour propager les mauvaises pratiques, sur FreeBSD , sous la couche de compatibilité Linux (linuxulator?),
Références:
la source
Juste pour être complet ... Il y a aussi un générateur d'UUID installé avec le
dbus
paquet sur Debian. Je l'ai raté en regardant autour de moi plus tôt. C'est probablement le même algorithme que le paquet e2fsprogs, mais il n'ajoute pas les tirets, il pourrait donc être un peu plus propre pour vous:Grawity ajoute un conseil de sécurité: "Les UUID de DBus ne sont pas liés ou compatibles avec le RFC 4122. En outre, dbus-uuidgen utilise toujours le timestamp Unix comme les 4 derniers octets. Ils pourraient donc ne pas convenir à certaines utilisations." (Merci, Grawity, j'aurais dû remarquer cela dans la page de manuel.)
la source
dbus-uuidgen
utilise toujours l'horodatage Unix comme les 4 derniers octets. Ils pourraient donc ne pas convenir à certaines utilisations.Si vous ne voulez pas dépendre d'autres exécutables, ou si vous ne pouvez pas les utiliser, voici la version pure bash d' ici :
la source
T
variable peut être éliminée et lafor T
boucle peut être changée en:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(éclatée sur des lignes séparées si vous préférez).case
pour éliminer lesif
instructions ainsi que l'for
instruction interne . Cela rend le code beaucoup plus ordonné. Notez que les deuxB%15
devraient êtreB%16
etB%255
devraient êtreB%256
.source <(curl url)
J'ai trouvé ce script "one-liner" utile là où uuidgen n'est pas disponible. Cela évite également l’installation de modules externes pour Perl ou Python.
Testé avec succès sur SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 et plus récent. Je suis curieux de savoir si cela est sujet à la non-unicité, mais je n’ai pas été «mordu» au cours des 10 dernières années. Bien sûr,
head -1
pourrait être remplacé parhead -_other-value_ | tail -1
aussi.Expliquer,
/dev/random
et/dev/urandom
sont des générateurs aléatoires du noyau.od
(octal dump) a un commutateur de sortie hexadécimale (-x) produisant 16 octets par ligne.head
-n [| tail -1] (où n> 0) extrait une seule ligne de la sortie précédente.awk
définit OutputFieldSeparator comme un trait d'union chaque fois qu'une virgule apparaît dans l'instruction d'impression. En spécifiant indépendamment les champs 2 à 9, nous contrôlons les traits d'union et supprimons le compteur d'index / décalage avec lequel 'od' préfixe chaque ligne de sortie.Le résultat est un modèle de
8-4-4-4-12
caractères minusculesa-f0-9
.la source
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}'
Juste pour que le python ne se sente pas exclu:
Pour l'utiliser dans le shell:
Consultez l' UUID de la documentation Python pour connaître les types d'UUIDS pouvant être générés.
Pour générer un fichier compatible d'identifiant de machine systemd sur une machine autre que systemd, vous pouvez utiliser python pour le faire de cette façon:
la source
python3 -c "import uuid; print(uuid.uuid4())"
pour python3Perl fournit une bibliothèque UUID basée sur le
e2fsprogs
package. Sur mon système Debian, c'est lelibuuid-perl
paquet. Voici un exemple one-liner; voirman uuid
pour plus:Ce serait trivial d'ajouter à un shellscript avec des guillemets ou une
$()
notation:la source
Travaillé pour moi, alors j'ai couru
uuid
la source
J'ai écrit une petite fonction Bash en utilisant Python pour générer un nombre arbitraire d'UUID en bloc:
Si vous préférez les minuscules, changez:
À:
la source
Consultez la bibliothèque UUID OSSP ( http://www.ossp.org/pkg/lib/uuid/ ) et envisagez de l’installer. Certains projets l’offrent en option (par exemple PostgreSQL). Il gère correctement les UUID des versions 3 et 5 , ce qui allait au-delà de ce que ma bibliothèque installée (par exemple, e2fsprogs) pouvait gérer. Heureusement, openSUSE l’a dans l’un des principaux dépôts. Faire fonctionner une version avec Windows (par exemple, Cygwin) ou MySQL a été un fléau. On dirait qu'il est temps de passer à Linux / PostgreSQL / Python (et j'ai tellement adoré l'interface graphique SQLyog pour MySQL / MariaDB) car j'ai vraiment besoin des UUID v3 et v5.
la source
-v3 ns:URL custom-data
mécanisme d'ensemencement.Je suis certain que certains vont arriver ici et cherchent simplement un moyen simple de générer un identifiant unique à utiliser dans leurs scripts. Il n'est pas nécessaire que ce soit un véritable UUID.
Si tel est le cas, vous pouvez simplement procéder comme suit, ce qui générera un identifiant unique à la seconde près. Par conséquent, si vous l'exécutez plusieurs fois par seconde, vous obtiendrez toujours le même résultat.
générera des identifiants comme ceux suivants basés sur l’heure système actuelle:
REMARQUE: Si vous êtes sous Linux ou que Coreutils est installé sur un mac, vous pouvez utiliser ce qui suit pour générer un identifiant unique à la nanoseconde:
ou si vous préférez une solution à base de python jusqu'à la nanoseconde, qui devrait fonctionner presque partout, lancez:
la source
mktemp -u
comme dansMYID="$(mktemp -u)"
. Si vous pouvez vous permettre d'avoir des fichiers temporaires vides en attente jusqu'au redémarrage, laissez tomber le-u
:MYID="$(mktemp)"
Ce fil, avec ses exemples variés, m’était vraiment utile. J'ai souvent besoin de fonctions uuid de différents environnements. Et bien que j'adore les exemples purs bash, il est parfois plus pratique d'utiliser une bibliothèque d'un autre langage.
Ainsi, ruby (1.9.3+) intègre le module SecureRandom contenant un certain nombre de fonctions de hachage et d’id utiles. De la bash cli, vous pouvez le faire.
la source
la source
od -X -A n /dev/random | head -1 | cut -c3-38
vous donne ceci ci-dessous 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-25fbd26183a3Si vous utilisez Java 10.
la source
jshell
pouvez utiliser un script bash , et non comme une commande interactive . C'est très clair dans le post original.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
mais c'est beaucoup plus long que çauuidgen
.