185
Zobacz uuidgen
program, który jest częścią pakietu e2fsprogs .
Zgodnie z tym , libuuid
jest teraz częścią util-linux, a włączenie do e2fsprogs jest stopniowo wycofywane. Jednak w nowych systemach Ubuntu uuidgen
jest teraz w uuid-runtime
pakiecie.
Aby utworzyć identyfikator UUID i zapisać go w zmiennej:
uuid=$(uuidgen)
W moim systemie Ubuntu znaki alfabetu są wypisywane małymi literami, a w systemie OS X - dużymi literami (dzięki Davidowi za zwrócenie na to uwagi w komentarzu).
Aby przełączyć na wszystkie wielkie litery (po wygenerowaniu jak wyżej):
uuid=${uuid^^}
Aby przełączyć na wszystkie małe litery:
uuid=${uuid,,}
Jeśli na przykład masz dwa identyfikatory UUID i chcesz je porównać w Bash, ignorując ich wielkość, możesz wykonać tolower()
porównanie stylów w następujący sposób:
if [[ ${uuid1,,} == ${uuid2,,} ]]
uuid-runtime
pakietu bez wyraźnego powodu ... +1 do ciebie)echo -e 'f\nF' | grep '[[:xdigit:]]'
wypisują obie linie). Jeśli ma to dla Ciebie znaczenie i masz Bash 4, możesz to zrobić, aby małe litery:uuid=$(uuidgen); uuid=${uuid,,}
lub to, aby było wielkie:uuid=$(uuidgen); uuid=${uuid^^}
lub coś w tymtolower()
stylu, aby wykonać test stylu:if [[ ${uuid1,,} == ${uuid2,,} ]]
Aby dodać różnorodność bez dodawania zewnętrznych zależności, w systemie Linux możesz:
Aby propagować złe praktyki na FreeBSD , w warstwie kompatybilności z linuksem (linuxulator?),
Bibliografia:
źródło
Ze względu na kompletność ... Jest także generator UUID z
dbus
pakietem na Debianie. Tęskniłem za rozglądaniem się wcześniej. Prawdopodobnie jest to ten sam algorytm co pakiet e2fsprogs, ale nie dodaje myślników, więc może być dla ciebie trochę czystszy:Grawity dodaje wskazówkę dotyczącą bezpieczeństwa: „UUID DBus nie są powiązane ani zgodne z RFC 4122. Poza tym dbus-uuidgen zawsze używa uniksowego znacznika czasu jako ostatnich 4 bajtów. Więc mogą być nieodpowiednie dla niektórych zastosowań.” (Dzięki, Grawity, powinienem to zauważyć na stronie podręcznika.)
źródło
dbus-uuidgen
zawsze używa uniksowego znacznika czasu jako ostatnich 4 bajtów. Mogą więc nie nadawać się do niektórych zastosowań.Jeśli nie chcesz polegać na innych wykonywalnych lub nie można ich użyć, tutaj jest czysta wersja bash od tutaj :
źródło
T
Zmienna może być wyeliminowana, afor T
pętla może zostać zmienione na:case $N in 3 | 5 | 7 | 9) printf '-';; esac
(podzielone na oddzielne linie od preferencji).case
do wyeliminowaniaif
instrukcji, a także instrukcję wewnętrznąfor
. To sprawia, że kod jest znacznie prostszy. Zauważ, że obaB%15
powinny byćB%16
iB%255
powinny byćB%256
.source <(curl url)
czy cokolwiek innegoUważam, że ten skrypt „one-liner” jest użyteczny tam, gdzie uuidgen nie jest dostępny. Pomija to również konieczność instalowania zewnętrznych modułów dla Perla lub Pythona.
Testy przeprowadzone na SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 i nowszych. Jestem ciekawy, czy jest to podatne na wyjątkowość, ale przez ostatnie 10 lat nie byłem „trochę przygnębiony”. Oczywiście
head -1
można je również zastąpićhead -_other-value_ | tail -1
.Wytłumaczyć,
/dev/random
i/dev/urandom
są losowymi generatorami jądra.od
(zrzut ósemkowy) ma przełącznik wyjścia szesnastkowego (-x) wytwarzający 16 bajtów na linię.head
-n [| tail -1] (gdzie n> 0) wyodrębnia tylko jeden wiersz poprzedniego wyniku.awk
ustawia OutputFieldSeparator jako myślnik wszędzie tam, gdzie występuje przecinek w instrukcji print. Określając pola 2-9 niezależnie, kontrolujemy łączniki i usuwamy licznik indeksu / offsetu, przed którym „od” poprzedza każdą linię wyniku.Rezultatem jest wzór
8-4-4-4-12
małych litera-f0-9
.źródło
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}'
Właśnie dlatego python nie czuje się wykluczony:
Aby użyć go w powłoce:
Zobacz UUID dokumentacji Pythona, aby dowiedzieć się, jakie rodzaje UUIDS można wygenerować.
Aby wygenerować plik zgodny z identyfikatorem systemowym komputera na komputerze niesystemowym, możesz użyć Pythona, aby to zrobić w ten sposób:
źródło
python3 -c "import uuid; print(uuid.uuid4())"
dla python3Perl udostępnia bibliotekę UUID na podstawie
e2fsprogs
pakietu. W moim systemie Debian jest tolibuuid-perl
pakiet. Oto przykładowy jeden wiersz; zobaczman uuid
więcej:Byłoby trywialne dodawanie do shellscript za pomocą odwrotnych
$()
znaków lub notacji:źródło
Pracował dla mnie, a potem pobiegłem
uuid
źródło
Napisałem małą funkcję Bash, używając Pythona do generowania dowolnej liczby identyfikatorów UUID:
Jeśli wolisz małe litery, zmień:
Do:
źródło
Proszę spojrzeć na bibliotekę UUID OSSP ( http://www.ossp.org/pkg/lib/uuid/ ) i rozważyć zainstalowanie jej. Niektóre projekty oferują to jako opcję (np. PostgreSQL). Prawidłowo obsługuje UUID wersji 3 i wersji 5 , co wykraczało poza możliwości mojej zainstalowanej biblioteki (np. E2fsprogs). Na szczęście openSUSE ma to w jednym z głównych repozytoriów. Uzyskiwanie wersji do pracy w systemie Windows (np. Cygwin) lub MySQL było bujakiem. Wygląda na to, że nadszedł czas, aby przejść na Linux / PostgreSQL / Python (i bardzo podobało mi się GUI SQLyog na MySQL / MariaDB), ponieważ naprawdę potrzebuję UUID v3 i v5.
źródło
-v3 ns:URL custom-data
mechanizmu inicjującego.Jestem pewien, że niektórzy tu przybędą i właśnie szukają łatwego sposobu na wygenerowanie unikalnego identyfikatora do użycia w swoich skryptach i nie musi to być prawdziwy UUID.
Jeśli tak, możesz po prostu wykonać następujące czynności, które wygenerują identyfikator, który jest unikalny aż do sekundy - więc jeśli uruchomisz to wiele razy w ciągu sekundy, nadal otrzymasz ten sam wynik.
wygeneruje identyfikatory takie jak następujące na podstawie bieżącego czasu systemowego:
UWAGA: Jeśli korzystasz z systemu Linux lub masz Coreutils zainstalowany na komputerze Mac, możesz użyć następujących opcji, aby wygenerować unikalny identyfikator nanosekundy:
lub jeśli wolisz rozwiązanie oparte na pythonie niż nanosekundę, które powinno działać prawie wszędzie, uruchom:
źródło
mktemp -u
jak wMYID="$(mktemp -u)"
. Jeśli możesz sobie pozwolić na tworzenie pustych plików tymczasowych aż do ponownego uruchomienia, upuść-u
:MYID="$(mktemp)"
Ten wątek, z różnymi przykładami, był dla mnie bardzo przydatny. Często potrzebuję funkcji UUID z wielu różnych środowisk. I chociaż uwielbiam przykłady czystej bashu, czasem wygodniej jest używać biblioteki z innego języka.
Dla dokładności ruby (1.9.3+) ma wbudowany moduł SecureRandom zawierający szereg użytecznych funkcji skrótu i identyfikatora. Z bash cli możesz to zrobić.
źródło
źródło
od -X -A n /dev/random | head -1 | cut -c3-38
daje to poniżej 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-25fbd26183a3Jeśli używasz Java 10.
źródło
jshell
można go używać w skryptach bash , a nie jako polecenie interaktywne . Jest to bardzo jasne w oryginalnym poście.echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">"
Ale jest to o wiele bardziej skomplikowane niżuuidgen
.