कैसे करें UUID को bash में?


185

जावा में एक यादृच्छिक UUID बनाना संभव है :

UUID uuid = UUID.randomUUID();

बाश में यह कैसे करना है?

जवाबों:


225

uuidgenप्रोग्राम देखें जो e2fsprogs पैकेज का हिस्सा है ।

के अनुसार इस , libuuidअब का हिस्सा है util-linux और e2fsprogs में शामिल किए जाने लिया जा रहा है। हालाँकि, नए उबंटू सिस्टम पर, uuidgenअब uuid-runtimeपैकेज में है।

एक यूआईडी बनाने और उसे एक चर में सहेजने के लिए:

uuid=$(uuidgen)

मेरे उबंटू सिस्टम पर, अल्फा अक्षर लोअर केस के रूप में आउटपुट होते हैं और मेरे ओएस एक्स सिस्टम पर, वे ऊपरी केस के रूप में आउटपुट होते हैं (एक टिप्पणी में इसे इंगित करने के लिए डेविड का धन्यवाद)।

सभी ऊपरी मामले पर स्विच करने के लिए (ऊपर के रूप में उत्पन्न करने के बाद):

uuid=${uuid^^}

सभी निचले मामलों पर स्विच करने के लिए:

uuid=${uuid,,}

यदि, उदाहरण के लिए, आपके पास दो UUID हैं और आप उनकी तुलना Bash में करना चाहते हैं, तो उनके मामले को अनदेखा करते हुए, आप tolower()इस तरह से एक शैली तुलना कर सकते हैं :

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

7
हे, कोई निष्पक्ष! मेरे e2fsprogs उस के साथ नहीं आए! मुझे एक चाहिए, मुझे यह कहां मिलेगा? (अद्यतन: आह ... डेबियन uuid-runtimeने बिना किसी स्पष्ट कारण के इसे पैकेज में चिपका दिया ... +1 आप तक)
क्वैक क्विक्सोट

uuidgen freeBSD पर बेसिन आता है। यह हमेशा e2fsprogs पैकेज में नहीं होता है।
अच्छा व्यक्ति

1
@Rob: अपने मूल प्रश्न का उत्तर देने के लिए, यह ड्राइव लेबल के लिए है
डेनिस विलियमसन

2
मुझे लगता है कि मैक पर uuidgen सभी निचले भाग में Ubuntu (uuidgen से उपयोग-लाइनक्स 2.20.1) पर uppercase में निकलता है। अंतर क्यों? इसके अलावा उबंटू ने सूचीबद्ध किया कि उपकरण कहां से आया है, लेकिन मैक पर, कोई संस्करण जानकारी नहीं है और न ही यह किस पैकेज से आया है।
डेविड

1
@ डेविड: मेरा मानना ​​है कि यह ओएस एक्स पर आधार ऑपरेटिंग सिस्टम का हिस्सा है। मुझे नहीं पता कि एक ऊपरी मामला क्यों है और दूसरा कम है। यह वास्तव में मायने नहीं रखता है क्योंकि या तो वैध हेक्स वर्णों ( echo -e 'f\nF' | grep '[[:xdigit:]]'दोनों लाइनों के आउटपुट) का प्रतिनिधित्व करता है । अगर यह आपके लिए मायने रखता है और आपके पास बैश 4 है, तो आप इसे कम केस बनाने के लिए कर सकते हैं: uuid=$(uuidgen); uuid=${uuid,,}या इसे ऊपरी मामला बनाने के लिए: uuid=$(uuidgen); uuid=${uuid^^}या tolower()स्टाइल टेस्ट करने के लिए इन पंक्तियों के साथ कुछ करें :if [[ ${uuid1,,} == ${uuid2,,} ]]
डेनिस विलियमसन

168

बाहरी निर्भरता को जोड़े बिना विविधता जोड़ने के लिए, लिनक्स पर आप कर सकते हैं:

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

लाइनबीएस संगतता परत (लाइनक्सुलेटर?) के तहत फ्रीबीएसडी पर खराब प्रथाओं का प्रचार करने के लिए ?

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

संदर्भ:


19
यह कमाल का है।
टॉम ओ'कॉनर

3
इससे बचना चाहिए क्योंकि यह अत्यधिक गैर-पोर्टेबल है (हालांकि फ्रीबीएसडी आपूर्ति / कॉम्पिटिटर / लिनेक्स / प्रोक / एसआईएस / कर्नेल / रैंडम / यूयूआईडी खराब लिखे गए अनुप्रयोगों के लिए)
गुड पर्सन

1
यह initrd छवि के अंदर उपयोग के लिए पूरी तरह से फिट बैठता है
मैक्सिमिलियन

2
यह सबसे अच्छा जवाब होना चाहिए!
डगरेरी

6
यह डॉकटर कंटेनर की तरह वास्तव में न्यूनतम सेटअप के लिए एक बेहतर जवाब है।
जैकेरेडा

34

बस पूर्णता के लिए ... dbusडेबियन पर पैकेज के साथ स्थापित एक यूयूआईडी जनरेटर भी है । मैं इसे पहले के आसपास देख याद किया। यह शायद e2fsprogs पैकेज के समान एल्गोरिथ्म है, लेकिन यह डैश को जोड़ता नहीं है, इसलिए यह इसके लिए थोड़ा सा धुआं हो सकता है:

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

ग्रैविटी एक सुरक्षा टिप जोड़ता है: "DBus UUIDs RFC 4122 के साथ संबंधित या संगत नहीं हैं । इसके अलावा, dbus-uuidgen हमेशा यूनिक्स टाइमस्टैम्प का उपयोग अंतिम 4 बाइट्स के रूप में करता है। इसलिए वे कुछ उपयोगों के लिए अनुपयुक्त हो सकते हैं।" (धन्यवाद, विशालता, मुझे मैनपॉट में देखा जाना चाहिए था।)


7
DBus UUIDs RFC 4122 के साथ संबंधित या संगत नहीं हैं। इसके अलावा, dbus-uuidgenहमेशा अंतिम 4 बाइट्स के रूप में यूनिक्स टाइमस्टैम्प का उपयोग करता है। इसलिए वे कुछ उपयोगों के लिए अनुपयुक्त हो सकते हैं।
ग्रैविटी

फेडोरा -25 पर भी यही काम करता है ...
kmonsoor

20

यदि आप अन्य निष्पादन योग्य वस्तुओं पर निर्भर नहीं होना चाहते हैं, या आप उनका उपयोग नहीं कर सकते हैं, तो यहां से शुद्ध बैश संस्करण है :

# 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चर समाप्त किया जा सकता है और for Tपाश करने के लिए बदला जा सकता है: case $N in 3 | 5 | 7 | 9) printf '-';; esac(अलग पंक्ति में बाहर टूट अगर पसंद किया)।
डेनिस विलियमसन

1
मैंने गथब लिंक पर कोड में एक टिप्पणी जोड़ दी case, ifजिसमें बयानों के साथ-साथ आंतरिक forविवरण को समाप्त करने के लिए एक संस्करण दिखाया गया है । यह कोड को बहुत अधिक निर्वस्त्र बनाता है। ध्यान दें कि दोनों B%15होना चाहिए B%16और B%255होना चाहिए B%256
डेनिस विलियमसन

इसे एक url पर ऑनलाइन रखें ताकि लोग इसे स्रोत कर सकें और इसे source <(curl url)या जो भी प्रयास करें
MrCholo

19

मुझे यह स्क्रिप्ट "वन-लाइनर" उपयोगी लगी है, जहां uuidgen उपलब्ध नहीं है। यह पर्ल या पायथन के लिए बाहरी मॉड्यूल स्थापित करने के लिए किसी भी तरह की नग्नता को भी नजरअंदाज करता है।

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

स्नो लेपर्ड, रेड हैट वल्लाह, सोलारिस 9 4/04 और नए सफलतापूर्वक परीक्षण किए गए। मैं उत्सुक हूँ अगर यह गैर-विशिष्टता के लिए प्रवण है, लेकिन मुझे पिछले 10 वर्षों में 'बिटकॉइन' नहीं किया गया है। बेशक, head -1इसे head -_other-value_ | tail -1भी बदला जा सकता है।

समझाना,

/dev/randomऔर /dev/urandomकर्नेल यादृच्छिक जनरेटर हैं।

od (ऑक्टल डंप) में एक हेक्स आउटपुट स्विच (-x) है जो प्रति पंक्ति 16 बाइट्स का उत्पादन करता है।

head-एन [| पूंछ -1] (जहां n> 0) पिछले आउटपुट की सिर्फ एक पंक्ति निकालता है।

awkOutputFieldSeparator को हर जगह एक हाइफ़न सेट करने के लिए सेट किया जाता है जो प्रिंट स्टेटमेंट में होता है। फ़ील्ड्स को स्वतंत्र रूप से 2-9 निर्दिष्ट करके, हम हाइफ़न को नियंत्रित करते हैं और इंडेक्स / ऑफ़सेट काउंटर को स्ट्रिप करते हैं जो आउटपुट के प्रत्येक लाइन को 'ओडी' उपसर्ग करता है।

परिणाम 8-4-4-4-12निचले मामले के पात्रों का एक पैटर्न है a-f0-9

993bb8d7-323d-b5ee-db78-f976a59d8284

1
प्रतिभाशाली! कोई भी निर्भरता वाली बस एक लाइन, BSD /
macOS

करो नहीं "पूंछ -1" का उपयोग करें। यदि आप अपने आप में सिर्फ "od -x / dev / urandom" चलाते हैं, तो यह अनिश्चित काल तक चलता रहता है, जिससे लगातार यादृच्छिक डेटा की अधिक लाइनें बनती हैं। "पूंछ -1" बस हमेशा के लिए "अंतिम" लाइन के इंतजार में बैठ सकती है। अन्यथा, यह एक अच्छा समाधान है।
UncaAlby

कृपया ध्यान दें, पूंछ केवल एक वैकल्पिक पैरामीटर के रूप में "स्पष्टीकरण" में है जब सिर द्वारा लाइनों के उत्पादन की संख्या एक से अधिक होती है। जागरण द्वारा 16 बाइट्स की एक पंक्ति प्राप्त करना सुनिश्चित करने के लिए, और मूल कमांड का हिस्सा नहीं है। ओड से सिर तक पाइप पहले से ही पाइप -1 के लिए आउटपुट को सैनिटाइज करता है। मेरे अनुभव में, एक ही समय पूंछ हमेशा एक-एफ तर्क के साथ है। मैं माफी माँगता हूँ अगर स्पष्टीकरण स्पष्ट नहीं था जहाँ यह कहा गया है कि पूंछ -1 का उपयोग केवल तभी आवश्यक है जब सिर का उत्पादन एक से अधिक लाइन का उत्पादन करता है।
दान

2
करो नहीं इस का उपयोग, यह पूरी तरह से UUID विनिर्देश उल्लंघन करती है। केवल संस्करण 4 यूयूआईडी को इस तरह यादृच्छिक बनाने की अनुमति है।
jlh

3
@jlh मुझे यकीन नहीं है कि यह प्रश्न क्यों लॉक किया गया था, लेकिन यहां एक निश्चित संस्करण है जो इस दृष्टिकोण को UUID-v4 के अनुरूप बनाता है: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}'
स्टुअर्ट पी। बेंटले

14

बस इतना अजगर छोड़ दिया महसूस नहीं करता है:

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

शेल में इसका उपयोग करने के लिए:

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

उत्पन्न होने वाले UUIDS के प्रकारों के लिए पायथन डॉक्यूमेंटेशन UUID देखें ।

गैर-सिस्टमड मशीन पर एक सिस्टम-मशीन-आईडी संगत फ़ाइल उत्पन्न करने के लिए, आप इसे करने के लिए अजगर का उपयोग कर सकते हैं:

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

क्या एक अंतर्निहित है?
अलेक्जेंडर मिल्स

क्या अजगर ने कभी काम किया है? मुझे यह `फ़ाइल" <string> ", पंक्ति 1 आयात uuid; प्रिंट uuid.uuid1 () ^ SyntaxError: अमान्य सिंटैक्स `
अलेक्जेंडर मिल्स

1
python3 -c "import uuid; print(uuid.uuid4())"Python3 के लिए उपयोग करें
abdusco

11

पर्ल e2fsprogsपैकेज के आधार पर एक यूयूआईडी लाइब्रेरी प्रदान करता है । मेरे डेबियन सिस्टम पर यह libuuid-perlपैकेज है। यहां एक उदाहरण वन-लाइनर है; 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

यह बैकटिक्स या $()अंकन के साथ एक गोले में जोड़ने के लिए तुच्छ होगा :

#!/bin/bash
# ...do some stuff
$myvar = $(perl -e 'use UUID;  UUID::generate($uuid);  UUID::unparse($uuid, $string);  print "$string";')
# ...do some more stuff

+1 - मेरी बहुत मदद करो!
rafa.ferreira


1

मैंने थोक में UUIDs की एक मनमानी संख्या उत्पन्न करने के लिए पायथन का उपयोग करके थोड़ा बैश फ़ंक्शन लिखा:

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

यदि आप लोअरकेस पसंद करते हैं, तो बदलें:

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

सेवा:

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

1

कृपया OSSP UUID लाइब्रेरी ( http://www.ossp.org/pkg/lib/uuid/ ) देखें, और इसे स्थापित करने पर विचार करें। कुछ परियोजनाएं इसे एक विकल्प के रूप में पेश करती हैं (उदाहरण के लिए PostgreSQL)। यह ठीक से संस्करण 3 और संस्करण 5 यूयूआईडी को संभालता है , जो कि मेरे स्थापित (जैसे e2fsprogs) पुस्तकालय को संभाल सकता है से परे था। सौभाग्य से, ओपनएसयूएसई के पास मुख्य रिपोस में से एक में है। W / Windows (जैसे Cygwin) या MySQL काम करने के लिए एक संस्करण प्राप्त करना एक असफलता रही है। ऐसा लगता है कि यह Linux / PostgreSQL / Python पर स्विच करने का समय है (और मुझे MySQL / MariaDB को SQLyog GUI बहुत पसंद है) क्योंकि मुझे वास्तव में v3 और v5 UUIDs की आवश्यकता है।


पूरी तरह से सहमत! मेरे उपयोग के मामले के लिए यह एकदम सही था क्योंकि यह -v3 ns:URL custom-dataसीडिंग मैकेनिज्म के जरिए नेमस्पेसिंग का भी समर्थन करता है।
रॉबर्टो एंड्रेड

1

मुझे यकीन है कि कुछ लोग यहां पहुंचेंगे, और बस अपनी स्क्रिप्ट में उपयोग के लिए एक अद्वितीय आईडी बनाने के लिए एक आसान तरीका ढूंढ रहे हैं, और इसे एक सच्चे यूयूआईडी होने की आवश्यकता नहीं है।

यदि ऐसा है, तो आप केवल निम्नलिखित कार्य कर सकते हैं, जो एक आईडी उत्पन्न करेगा जो कि दूसरे के लिए अद्वितीय है - इसलिए यदि आप इसे एक सेकेण्ड के भीतर कई बार चलाते हैं, तो भी आपको वही परिणाम मिलेगा।

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

वर्तमान सिस्टम समय के आधार पर निम्नलिखित की तरह आईडी उत्पन्न करेगा:

U1454423662

नोट: यदि आप लिनक्स पर हैं, या एक मैक पर Coreutils स्थापित है, तो आप नैनोसेकंड के लिए एक अद्वितीय आईडी बनाने के लिए निम्नलिखित का उपयोग कर सकते हैं:

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

या यदि आप नैनोसेकंड के नीचे एक अजगर आधारित समाधान पसंद करते हैं, जो लगभग हर जगह काम करना चाहिए, तो चलाएं:

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

1
यह कुल मिलाकर एक बहुत बुरा अभ्यास है। आधुनिक कंप्यूटर समानांतर में कई चीजों को चलाने और धारावाहिक कार्यों को जल्दी से पूरा करने में पूरी तरह से सक्षम हैं, लेकिन यह आईडी किसी भी इनवोकेशन के लिए समान होगी जो दूसरे के एक सेकंड के भीतर हैं। एक ही समय में इस स्क्रिप्ट को चलाने वाले किसी अन्य कंप्यूटर का उल्लेख नहीं करना। एक बेहतर-लेकिन-फिर भी महान विकल्प के mktemp -uरूप में नहीं होगा MYID="$(mktemp -u)"। यदि आप रिबूट होने तक खाली पड़ी फाइलों को रखना चाहते हैं, तो ड्रॉप करें -u:MYID="$(mktemp)"
क्रिस हैरिंगटन

हे ... दूसरे बिंदु के लिए एकमात्र अद्वितीय पर अच्छे अंक ... मैं ऊपर कुछ नोट्स जोड़ूंगा ...
ब्रैड पार्क्स

1

यह धागा, इसके विविध उदाहरण हैं, वास्तव में मेरे लिए उपयोगी थे। मुझे अक्सर विभिन्न वातावरणों से uuid कार्यों की आवश्यकता होती है। और जब मैं शुद्ध बैश उदाहरणों से प्यार करता हूं, तो एक अलग भाषा से पुस्तकालय का उपयोग करना कभी-कभी अधिक सुविधाजनक होता है।

तो बस पूरी तरह से, रूबी (1.9.3+) में बिल्ट-इन सिक्योर रैंडम मॉड्यूल है जिसमें कई उपयोगी हैश और आईडी फ़ंक्शन हैं। बैश क्ली से, आप यह कर सकते हैं।

ruby -r securerandom -e 'puts SecureRandom.uuid'

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`

3
थोड़ा और स्पष्टीकरण आपके उत्तर में मदद करेगा
डेव एम

x = od -X -A n /dev/random | head -1 | cut -c3-38 आपको यह नीचे दिया गया है इको $ 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-1be7d-0bef-8a07-25fb26183a3
-yfff

डेव एम, कई वर्षों के बाद वापस बैश कर रहे हैं, यह मेरे वर्तमान ज्ञान के किनारे पर बहुत अधिक है। आशा है कि इसे तोड़ने से थोड़ी मदद मिलती है। चीयर्स, एंडीफ
एंडीफ

-1

यदि आप Java 10 का उपयोग कर रहे हैं।

$ jshell
jshell> import java.util.*
jshell> String id = UUID.randomUUID().toString();

जावा 10 बैश नहीं है।
कास्परड सेप

मैंने सिर्फ एक उदाहरण दिया कि वह कितनी जल्दी एक जावा प्रोग्राम को चलाए बिना टर्मिनल पर UUID उत्पन्न कर सकता है। लोगों ने dbus-uuidgen और uuidgen के उपयोग का उदाहरण दिया । Jshell का उपयोग करने में गलत है?
amit

1
@ बात यह है कि आपको एक उदाहरण देने की आवश्यकता है जहां बैश स्क्रिप्टिंग में इस्तेमाल कियाjshell जा सकता है , और एक इंटरैक्टिव कमांड के रूप में नहीं । यह मूल पोस्ट में बहुत स्पष्ट है।
3

यदि आपको इस सूची में कुछ करना चाहिए, तो आप कर सकते हैं echo "System.out.println(java.util.UUID.randomUUID().toString())" | /Library/Java/JavaVirtualMachines/openjdk-11.0.1.jdk/Contents/Home/bin/jshell -s | grep -v ">" लेकिन यह बहुत अधिक लंबी है uuidgen
14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.