सवाल बैश में यूयूआईडी कैसे बनाएं?


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

UUID uuid = UUID.randomUUID();

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


163
2018-01-16 13:41


मूल




जवाब:


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

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

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

uuid=$(uuidgen)

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

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

uuid=${uuid^^}

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

uuid=${uuid,,}

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

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

185
2018-01-16 14:01



हे, कोई उचित नहीं! मेरे e2fsprogs उस के साथ नहीं आया था! मुझे एक चाहिए, मुझे यह कहां मिल सकता है? (अद्यतन: आह ... डेबियन इसे चिपकता है uuid-runtime कोई स्पष्ट कारण के लिए पैकेज ... आपको +1) - quack quixote
यूयूडजेन फ्रीबीएसडी पर बनाया गया है। यह हमेशा e2fsprogs पैकेज में नहीं है। - Good Person
@ रोब: अपने मूल प्रश्न का उत्तर देने के लिए, यह है ड्राइव लेबल। - Dennis Williamson
मैं सभी लोअरकेस में उबंटू (यूयूडजेन यूज-लिनक्स 2.20.1) पर सभी अपरकेस में मैक उत्सर्जित करता हूं। अंतर क्यों? इसके अलावा उबंटू ने सूचीबद्ध किया जहां उपकरण आया था लेकिन मैक पर, कोई संस्करण जानकारी नहीं है और न ही यह कौन सा पैकेज आया है। - David
@ डेविड: मेरा मानना ​​है कि यह ओएस एक्स पर बेस ऑपरेटिंग सिस्टम का हिस्सा है। मुझे नहीं पता कि कोई ऊपरी मामला क्यों है और दूसरा कम है। यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि या तो वैध हेक्स वर्णों का प्रतिनिधित्व करता है (echo -e 'f\nF' | grep '[[:xdigit:]]' दोनों लाइनों का उत्पादन)। यदि यह आपके लिए मायने रखता है और आपके पास बैश 4 है, तो आप इसे कम केस बनाने के लिए कर सकते हैं: uuid=$(uuidgen); uuid=${uuid,,} या इसे ऊपरी मामला बनाने के लिए: uuid=$(uuidgen); uuid=${uuid^^} या इन लाइनों के साथ कुछ करने के लिए tolower() शैली परीक्षण: if [[ ${uuid1,,} == ${uuid2,,} ]] - Dennis Williamson


बाहरी निर्भरताओं को जोड़ने के बिना विविधता जोड़ने के लिए लिनक्स तुम कर सकते हो:

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

खराब प्रथाओं का प्रचार करने के लिए, चालू करें FreeBSD, लिनक्स संगतता परत (linuxulator?) के तहत,

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

संदर्भ:


128
2017-08-07 12:55



यह कमाल का है। - Tom O'Connor
इससे बचा जाना चाहिए क्योंकि यह अत्यधिक गैर पोर्टेबल है (हालांकि खराब लिखित अनुप्रयोगों के लिए फ्रीबीएसडी आपूर्ति / कम्पैट / लिनक्स / proc / sys / कर्नेल / यादृच्छिक / यूयूआईडी) - Good Person
यह initrd छवि के अंदर उपयोग के लिए पूरी तरह से फिट बैठता है - Maximilian
फ्रीबीएसडी विधि मैक ओएस एक्स (न ही लिनक्स विधि) पर प्रतीत नहीं होती है। मैक पर कम से कम uuidgen प्रीइंस्टॉल किया गया प्रतीत होता है (या इंस्टॉल किए गए किसी और चीज़ के साथ स्थापित किया गया था)। - David
डॉकर कंटेनर की तरह, वास्तव में न्यूनतम सेटअप के लिए यह एक बेहतर उत्तर है। - jacderida


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

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

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


28
2018-01-16 14:18



डीबीयूएस यूयूआईडी आरएफसी 4122 से संबंधित या संगत नहीं हैं। इसके अलावा, dbus-uuidgenहमेशा पिछले 4 बाइट्स के रूप में यूनिक्स टाइमस्टैम्प का उपयोग करता है। तो वे कुछ उपयोगों के लिए अनुपयुक्त हो सकते हैं। - grawity
फेडोरा -25 पर भी वही काम करता है, ... - kmonsoor


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

# 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

15
2018-05-21 21:12



T परिवर्तनीय को समाप्त किया जा सकता है और for T लूप को बदला जा सकता है: case $N in 3 | 5 | 7 | 9) printf '-';; esac (अगर पसंदीदा हो तो अलग लाइनों पर टूट गया)। - Dennis Williamson
मैंने जिथब लिंक पर कोड को एक संस्करण दिखाते हुए एक टिप्पणी जोड़ा case को खत्म करने के लिए if बयान के साथ ही आंतरिक भी for बयान। यह कोड को बहुत साफ करता है। ध्यान दें कि दोनों B%15 होना चाहिए B%16 तथा B%255 होना चाहिए B%256। - Dennis Williamson


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

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] (जहां एन> 0) पिछले आउटपुट की सिर्फ एक पंक्ति निकालता है।

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

नतीजा एक पैटर्न है 8-4-4-4-12 निचले केस अक्षर a-f0-9

993bb8d7-323d-b5ee-db78-f976a59d8284

13
2017-08-25 23:57



प्रतिभाशाली! कोई निर्भरता वाले केवल एक लाइन, बीएसडी / मैकोज़ संगत ... महान - dinigo
करना नहीं "पूंछ -1" का प्रयोग करें। यदि आप केवल "od -x / dev / urandom" चलाते हैं, तो यह अनिश्चित काल तक चलता है, लगातार यादृच्छिक डेटा की अधिक पंक्तियां उत्पन्न करता है। "पूंछ -1" बस "आखिरी" रेखा के लिए हमेशा इंतजार कर सकता है। अन्यथा, यह एक अच्छा समाधान है। - UncaAlby
कृपया ध्यान दें, पूंछ केवल "स्पष्टीकरण" में वैकल्पिक पैरामीटर के रूप में होता है जब सिर द्वारा लाइनों की संख्या एक से अधिक होती है। अजीब द्वारा 16 बाइट्स की एक पंक्ति प्राप्त करने के लिए सुनिश्चित करने के लिए, और मूल आदेश का हिस्सा नहीं है। ओडी से सिर करने के लिए पाइप पहले से ही पूंछ -1 के लिए उत्पादन को sanitizes। मेरे अनुभव में, एकमात्र समय पूंछ हमेशा के लिए इंतजार कर रहा है एक एफ तर्क के साथ। मैं क्षमा चाहता हूं कि स्पष्टीकरण स्पष्ट नहीं था कि यह कहां पूंछ -1 का उपयोग कहता है, केवल तब आवश्यक होता है जब सिर का उत्पादन एक से अधिक पंक्ति उत्पन्न करता है। - dan
करना नहीं इसका उपयोग करें, यह पूरी तरह से यूयूआईडी विनिर्देश का उल्लंघन करता है। केवल संस्करण 4 यूयूआईडी को इस तरह यादृच्छिक होने की अनुमति है। - jlh
@jlh मुझे यकीन नहीं है कि यह सवाल क्यों लॉक किया गया था, लेकिन यहां एक निश्चित संस्करण है जो इस दृष्टिकोण को यूयूआईडी-वी 4 अनुपालन करता है: 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}' - Stuart P. Bentley


बस इतना पाइथन बाहर नहीं लगता है:

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

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

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

देखें पायथन दस्तावेज़ीकरण यूयूआईडी यूयूआईडीएस के प्रकार के लिए जो उत्पन्न किया जा सकता है।

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

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

12
2018-01-16 15:26





पर्ल एक यूयूआईडी पुस्तकालय प्रदान करता है 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

11
2018-01-16 13:54



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


apt-get install uuid

मेरे लिए काम किया, तो आईडी चला गया uuid


3
2018-06-19 09:07





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

# 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
2017-08-03 22:16





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


1
2017-09-23 23:37



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