שאלה כיצד ליצור UUID ב- bash?


ב- Java ניתן ליצור אקראי UUIDYou

UUID uuid = UUID.randomUUID();

איך עושים את זה בבש?


163
2018-01-16 13:41






תשובות:


ראה uuidgen אשר הוא חלק e2fsprogs החבילה.

לפי זה, libuuid הוא עכשיו חלק לינוקס ואת ההכללה של effrogs הוא להיות בהדרגה. עם זאת, על מערכות חדשות אובונטו, uuidgen הוא עכשיו ב uuid-runtime החבילה.

כדי ליצור uuid ולשמור אותו משתנה:

uuid=$(uuidgen)

על מערכת אובונטו שלי, הדמויות אלפא הם פלט כמו במקרה נמוך במערכת OS X שלי, הם פלט כמו במקרה העליון (תודה דוד להצביע על זה הערה).

כדי לעבור לכל המקרה העליון (לאחר יצירתו כנ"ל):

uuid=${uuid^^}

כדי לעבור לכל המקרה התחתון:

uuid=${uuid,,}

אם, למשל, יש לך שני UUIDs ואתה רוצה להשוות אותם ב Bash, תוך התעלמות המקרה שלהם, אתה יכול לעשות tolower() השוואה בסגנון זה:

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

186
2018-01-16 14:01



היי, לא הוגן! e2fsprogs שלי לא הגיע עם זה! אני רוצה אחד, איפה אני מקבל את זה? (עדכון: ahhh ... debian מקלות אותו uuid-runtime חבילה ללא סיבה נראית לעין ... +1 לך) - quack quixote
מגיע מובנה ב freeBSD. זה לא תמיד בחבילה e2fsprogs. - Good Person
@Rob: כדי לענות על השאלה המקורית שלך, זה עבור תוויות כונן. - Dennis Williamson
אני מבחין uuidgen על מק פולט בכל באותיות רישיות בזמן על אובונטו (uuidgen מ-שימוש לינוקס 2.20.1) בכל אותיות קטנות. למה ההבדל? גם אובונטו ברשימה שבו הכלי הגיע אבל על מק, אין מידע גירסה ולא איזה חבילה זה בא. - David
@ David: אני מאמין שזה חלק של מערכת ההפעלה הבסיסית על OS X. אין לי מושג למה אחד הוא מקרה העליון והשני הוא נמוך יותר. זה לא ממש משנה מאז או מייצג תווים hex חוקי (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)

כדי להפיץ שיטות רעות, ב חינם, תחת שכבת תאימות לינוקס (linuxulator?),

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

הפניות:


128
2017-08-07 12:55



זה מדהים. - Tom O'Connor
זה צריך להימנע כפי שהוא מאוד לא נייד (למרות אספקת FreeBSD / compat / לינוקס / proc / sys / kernel / אקראי / uuid עבור יישומים שנכתב גרוע) - Good Person
זה מתאים באופן מושלם לשימוש בתוך התמונה initrd - Maximilian
השיטה של ​​FreeBSD אינה מופיעה ב- Mac OS X (ולא בשיטת Linux). לפחות Uuidgen נראה מותקן מראש על MAC (או הותקן עם משהו אחר התקנתי). - David
זוהי תשובה טובה יותר עבור setups מינימלי באמת, כמו מיכל Docker. - jacderida


רק לשם שלמות ... יש גם גנרטור UUID מותקן עם dbus חבילה בדביאן. התגעגעתי להסתכל מסביב קודם. זה כנראה אותו אלגוריתם כמו חבילת e2fsprogs, אבל זה לא מוסיף את מקפים, אז זה עשוי להיות קצת מנקה בשבילך:

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawity מוסיף עצה בטיחותית: "DBUS UUIDs אינם קשורים או תואמים RFC 4122. חוץ מזה, dbus-wuidgen תמיד משתמש חותמת יוניקס כמו 4 בתים אחרונים. אז הם עשויים להיות לא מתאימים לשימושים מסוימים." (תודה, גראוויטי, הייתי צריך לראות את זה בעמודים.)


28
2018-01-16 14:18



DBU UUIDs אינם קשורים או תואם RFC 4122. חוץ מזה, dbus-uuidgen תמיד משתמש חותמת יוניקס כמו 4 בתים אחרונים. אז הם עשויים להיות לא מתאים לשימושים מסוימים. - grawity
אותו עובד על Fedora-25, גם ... - kmonsoor


אם אתה לא רוצה לסמוך על הרצה אחרים, או שאתה לא יכול להשתמש בהם, הנה גרסת Bash טהור מ כאןYou

# 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
הוספתי תגובה לקוד בקישור github המציג גרסה באמצעות case למחוק if הצהרות כמו גם הפנימי for הצהרה. זה עושה את הקוד הרבה יותר מסודר. שים לב לשניהם B%15 צריך להיות B%16 ו B%255 צריך להיות B%256. - Dennis Williamson


מצאתי את התסריט "one-liner" שימושי שבו uuidgen אינו זמין. זה גם עוקפת כל נכונות להתקין מודולים חיצוניים עבור Perl או Python.

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

נבדק על SnowLeopard, Red Hat Valhalla, Solaris 9 4/04 ו חדש יותר בהצלחה. אני סקרן אם זה נוטה לא ייחודיות, אבל לא הייתי 'bit'ten ב -10 השנים האחרונות. כמובן, head -1 יכול להיות מוחלף עם head -_other-value_ | tail -1 מדי.

להסביר,

/dev/random ו /dev/urandom הם גנראטורים אקראיים ליבה.

od (אוקטלי dump) יש מתג פלט hex (-x) לייצר 16 בתים לכל שורה.

head -n [| זנב -1] (כאשר n> 0) מחלץ רק שורה אחת של הפלט הקודם.

awk מגדיר את OutputFieldSeparator להיות מקף בכל מקום פסיק מתרחשת בהודעת ההדפסה. על ידי ציון שדות 2-9 באופן עצמאי, אנו שולטים על מקפים ופסים את המדד / אופסט מונה כי "od" קידומת כל שורה של פלט עם.

התוצאה היא תבנית של 8-4-4-4-12 תווים באותיות קטנות a-f0-9.

993bb8d7-323d-b5ee-db78-f976a59d8284

14
2017-08-25 23:57



מבריק! רק שורה אחת ללא תלות, BSD / MacOS תואם ... נהדר - dinigo
האם לא השתמש "זנב -1". אם אתה מפעיל רק "od -x / dev / urandom" בפני עצמה, זה ממשיך ללא הגבלת זמן, ברציפות לייצר יותר שורות של נתונים אקראיים. "זנב -1" יכול פשוט לשבת שם לנצח מחכה לקו "האחרון". אחרת, זה פתרון טוב. - UncaAlby
שים לב, הזנב הוא רק ב "הסבר" כפרמטר אופציונלי כאשר מספר השורות פלט על ידי ראש גדול יותר. שם כדי להבטיח קבלת שורה אחת של 16 בתים על ידי awk, והוא לא חלק מהפקודה המקורית. הצינור בראש מ od כבר sanitizes את הפלט עבור צנרת כדי זנב -1. מניסיוני, זנב הזמן היחיד מחכה לעד הוא עם טיעון. אני מתנצל אם ההסבר לא היה ברור איפה הוא קובע את השימוש הזנב -1 הוא הכרחי רק כאשר פלט של הראש מייצרת יותר משורה אחת. - dan
האם לא שימוש זה, זה מפר לחלוטין את מפרט UUID. רק גרסה 4 UUID מותר להיות אקראי כזה. - jlh
@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}' - Stuart P. Bentley


רק כל כך פיתון לא מרגיש שנשאר:

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

כדי להשתמש בו בקליפה:

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

ראה תיעוד Python UUID עבור סוגים של UUIDS כי ניתן להפיק.

כדי ליצור קובץ תואם SystemD-ID על מכונת שאינו systemd, אתה יכול להשתמש python לעשות את זה ככה:

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

12
2018-01-16 15:26





פרל מספק ספריית UUID מבוסס על 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

זה יהיה טריוויאלי להוסיף פגז עם backticks או $() סימון:

#!/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





כתבתי פונקציית Bash קטנה באמצעות Python כדי ליצור מספר שרירותי של UUID בכמות גדולה:

# 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