প্রশ্ন কিভাবে bash একটি ইউUID তৈরি করতে?


জাভাতে এটি একটি র্যান্ডম তৈরি করা সম্ভব UUID:

UUID uuid = UUID.randomUUID();

কিভাবে এই বাশ করতে?


163
2018-01-16 13:41


উত্স




উত্তর:


দেখুন uuidgen প্রোগ্রাম যা অংশ e2fsprogs প্যাকেজ।

অনুসারে এই, libuuid এখন অংশ util-লিনাক্স এবং e2fsprogs অন্তর্ভুক্তকরণ পর্যায়ভুক্ত করা হচ্ছে। যাইহোক, নতুন উবুন্টু সিস্টেমে, uuidgen এখন হয় uuid-runtime প্যাকেজ।

একটি uuid তৈরি এবং একটি পরিবর্তনশীল এটি সংরক্ষণ করুন:

uuid=$(uuidgen)

আমার উবুন্টু সিস্টেমে, আলফা অক্ষরটি নিম্নতর ক্ষেত্রে এবং আমার ওএস এক্স সিস্টেমে আউটপুট হয়, তারা উচ্চতর ক্ষেত্রে আউটপুট হয় (ডেভিডকে মন্তব্যের জন্য এটি নির্দেশ করার জন্য ধন্যবাদ)।

সব উপরের ক্ষেত্রে স্যুইচ করতে (উপরের হিসাবে এটি জেনারেট করার পরে):

uuid=${uuid^^}

সব নিম্ন ক্ষেত্রে সুইচ করতে:

uuid=${uuid,,}

উদাহরণস্বরূপ, আপনার দুটি UUID আছে এবং আপনি তাদের ক্ষেত্রে অকার্যকর করে ব্যাশে তুলনা করতে চান তবে আপনি এটি করতে পারেন tolower() শৈলী তুলনা এই মত:

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

186
2018-01-16 14:01



আরে, কোন ন্যায্য! আমার e2fsprogs যে সঙ্গে আসে না! আমি এক চাই, আমি এটা কোথায় পেতে পারি? (আপডেট: আহহ ... ডেবিয়ান এটি লাঠি uuid-runtime কোন আপাত কারণে প্যাকেজ ... আপনার +1) - quack quixote
ইউইডিজেন ফ্রিBSD এ নির্মিত হয়। এটা 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
এটি এড়ানো উচিত কারণ এটি অত্যন্ত অ-পোর্টেবল (যদিও ফ্রিBSD সরবরাহ / কম্প্যাট / লিনাক্স / প্রসেস / সিএসএস / কার্নেল / এলোমেলো / ইউআইআইড খারাপ লিখিত অ্যাপ্লিকেশনের জন্য) - Good Person
এটি initrd ইমেজ ভিতরে ব্যবহারের জন্য পুরোপুরি ফিট করে - Maximilian
ফ্রিBSD পদ্ধতি ম্যাক ওএস এক্স (না লিনাক্স পদ্ধতি) তে উপস্থিত হয় না। অন্তত ইউইডিজেনটি ম্যাক (অথবা আমি ইনস্টল থাকা অন্য কিছু দিয়ে ইনস্টল করা হয়েছিল) -এ প্রি ইনস্টল করা আছে বলে মনে হচ্ছে। - David
এটি একটি ডকার কন্টেইনারের মত সত্যিই সংক্ষিপ্ত সেটআপের জন্য একটি ভাল উত্তর। - jacderida


শুধু সম্পূর্ণতার জন্য ... একটি UUID জেনারেটরের সাথে ইনস্টল আছে dbus ডেবিয়ান উপর প্যাকেজ। আমি এটি প্রায় চারপাশে খুঁজছেন মিস। এটি সম্ভবত e2fsprogs প্যাকেজ হিসাবে একই অ্যালগরিদম, তবে এটি ড্যাশ যোগ করে না, সুতরাং এটি আপনার জন্য একটি সামান্য ক্লিনার হতে পারে:

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

$ dbus-uuidgen
d17b671f98fced5649a856a54b51c9e6

Grawity একটি নিরাপত্তা টিপ যোগ করে: "DBus UUIDs সম্পর্কিত বা সাথে সামঞ্জস্যপূর্ণ হয় না আরএফসি 41২২। এছাড়া dbus,-uuidgen সর্বদা 4 টি বাইট হিসাবে ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করে। তাই তারা কিছু ব্যবহারের জন্য অনুপযুক্ত হতে পারে। "(ধন্যবাদ, Grawity, আমি manpage মধ্যে যে লক্ষ্য করা উচিত।)


28
2018-01-16 14:18



DBus UUID RFC 4122 এর সাথে সম্পর্কিত বা সামঞ্জস্যপূর্ণ নয়। এছাড়া, dbus-uuidgen সর্বদা 4 টি বাইট হিসাবে ইউনিক্স টাইমস্ট্যাম্প ব্যবহার করে। সুতরাং তারা কিছু ব্যবহারের জন্য অনুপযুক্ত হতে পারে। - grawity
ফেডোরা -২5 এও একই কাজ করে ... - 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 বিবৃতি। এটা কোড অনেক neater করে তোলে। মনে রাখবেন যে উভয় B%15 হতে হবে B%16 এবং B%255 হতে হবে B%256। - Dennis Williamson


আমি এই স্ক্রিপ্টটি "এক-মাছ ধরার নৌকা" খুঁজে পেয়েছি যেখানে 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 (অকটাল ডাম্প) একটি হেক্স আউটপুট সুইচ (-এক্স) লাইন প্রতি 16 বাইট উত্পাদন করে।

head -এন [| লেজ -1] (যেখানে n> 0) পূর্ববর্তী আউটপুট মাত্র এক লাইন নিষ্কাশন।

awk প্রিন্ট বিবৃতিতে সর্বদা একটি কমা একটি আউটপুট আউটপুটফিল্ডপারারেটর সেট করে। ক্ষেত্রগুলি 2-9 নির্দিষ্টভাবে স্বনির্ধারিত করে, আমরা হাইফেনগুলি নিয়ন্ত্রণ করে এবং সূচী / অফসেট কাউন্টারটি বন্ধ করে দিই যা 'od' দিয়ে আউটপুট প্রতিটি লাইনকে উপসর্গ করে।

ফলাফল একটি প্যাটার্ন 8-4-4-4-12 নিম্ন ক্ষেত্রে অক্ষর a-f0-9

993bb8d7-323d-b5ee-db78-f976a59d8284

14
2017-08-25 23:57



উজ্জ্বল! কোন নির্ভরতা সঙ্গে একটি একক লাইন, BSD / ম্যাকOS সামঞ্জস্যপূর্ণ ... মহান - dinigo
করা না "পুচ্ছ -1" ব্যবহার করুন। আপনি যদি কেবলমাত্র "od -x / dev / urandom" চালান তবে এটি অনির্দিষ্টকালের জন্য চলবে, ক্রমাগত র্যান্ডম ডেটা আরও লাইন তৈরি করবে। "লেজ -1" শুধু চিরতরে "শেষ" লাইনের জন্য অপেক্ষা করতে পারে। অন্যথা, এটি একটি ভাল সমাধান। - UncaAlby
অনুগ্রহ করে মনে রাখবেন, মাথার লাইনের আউটপুট সংখ্যা একের বেশি হলে লেজ কেবলমাত্র "ব্যাখ্যা" একটি ঐচ্ছিক পরামিতি হিসাবে। অদ্ভুত দ্বারা 16 বাইটের একটি লাইন প্রাপ্তির নিশ্চিত করার জন্য, এবং মূল কমান্ডের অংশ নয়। Od থেকে মাথা থেকে পাইপ ইতিমধ্যে পাইপিং লেজ -1 আউটপুট আউটপুট sanitizes। আমার অভিজ্ঞতায়, একমাত্র সময় লেজ চিরতরে অপেক্ষা করে-একটি আর্গুমেন্ট সঙ্গে। মাথার আউটপুটটি একাধিক লাইন তৈরি করে যখন লেভেল 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()')

দেখুন পাইথন ডকুমেন্টেশন UUID উত্পাদিত হতে পারে যে UUIDS ধরনের জন্য।

একটি non-systemd মেশিনে systemd মেশিন-আইডি সামঞ্জস্যপূর্ণ ফাইল উৎপন্ন করার জন্য, আপনি পাইথনটি এইভাবে ব্যবহার করতে পারেন:

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

এটি ব্যাকটিক্স সহ একটি শেলস্ক্রিপ্টে যোগ করতে তুচ্ছ হবে $() স্বরলিপি:

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