कैसे लिनक्स कमांड लाइन से एक यादृच्छिक मैक पता उत्पन्न करने के लिए


26

मैं लिनक्स कमांड लाइन से एक यादृच्छिक मैक पता कैसे उत्पन्न करूं?

मैं एक ऐसे समाधान की खोज करता हूं जिसमें केवल लिनक्स कमांड लाइन पर आमतौर पर पाए जाने वाले मानक टूल की आवश्यकता होती है।

मैक पते का उपयोग अतिथि KVM के लिए किया जाएगा।

जवाबों:


46

मैं उपयोग करता हूं

macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

इस पद्धति का लाभ, पूरी तरह से यादृच्छिक संख्या में, यह है कि मशीन के FQDN के आधार पर मैक पते को मज़बूती से पुन: पेश करना संभव है, जो मुझे कभी-कभी उपयोगी लगता है। 02पहली ओकटेट के लिए सिर्फ "स्थानीय रूप से सौंपा" सा है, जो यह स्पष्ट है कि यह एक विक्रेता के द्वारा उपलब्ध कराया मैक पता नहीं है, और गारंटी नहीं देता है कि आप सेट टकराती नहीं एक असली एनआईसी का MAC पता के साथ होगा।

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


प्रजनन के लिए +1; कुछ अनुप्रयोगों के लिए, यह मेरा एक बहुत बेहतर तरीका है।
MadHatter

बहुत बहुत धन्यवाद, मुझे यह प्रतिलिपि प्रस्तुत करने का विचार पसंद है।
एरिक Sjölund

इसके अलावा नहीं मैक पते की संभावना नहीं है घटना में आप बेतरतीब ढंग से एक ही मैक उत्पन्न करेंगे दो बार
पेट्टर एच।

3
विकल्प के रूप में आप उपयोग कर सकते हैंtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
यह केवल एक "विकल्प" है इस अर्थ में कि यह मेरे स्निपेट के लिए एक पूरी तरह से अलग अंतिम परिणाम पैदा करता है ...
वोमबल

8

पोस्ट की गई स्क्रिप्ट अच्छी हैं, लेकिन मैं एक चेतावनी जोड़ना चाहता हूं: माइंड द बर्थडे (विरोधाभास)!

यह इस तथ्य से आता है कि भले ही आपके पास सिर्फ 23 लोग हों, लेकिन मौका पहले ही 50% है कि उनमें से 2 का उसी दिन जन्मदिन है।

यह आपके परिदृश्य पर निर्भर करता है कि आप इसका उपयोग कैसे करते हैं, लेकिन यदि आप बेतरतीब ढंग से एमएसीएस उत्पन्न करते हैं, तो लगभग 1 मिलियन मैक नंबर क्लैश के लिए आपका मौका 40% है 2 मिलियन पर यह पहले से ही 87% है!

यदि आपको बस एक जोड़े की आवश्यकता है तो यह ठीक है, लेकिन जब आप सैकड़ों सर्वरों के साथ एक सर्वर फ़ार्म बनाए रखते हैं, तो उनमें से प्रत्येक दसियों वर्चुअल मशीनों की मेजबानी करता है, या यदि आप बहीखाता पद्धति के लिए कुछ db में इंडेक्स के रूप में macs का उपयोग करते हैं और आपको चाहिए कि वे सावधान रहें !


जन्मदिन विरोधाभास के बारे में चेतावनी के लिए धन्यवाद! मेरे मामले में मैं जोखिम उठाऊंगा क्योंकि मैं लगभग 20 मैक पते उत्पन्न करूंगा।
एरिक Sjölund

3
यदि आप सैकड़ों सर्वरों को एक ही ब्रॉडकास्ट डोमेन पर हर दसियों वर्चुअल मशीन पर चला रहे हैं, तो आपको मैक एड्रेस टकराने के जोखिम से बड़ी समस्याएं हैं।
Womble

1
" यह इस तथ्य से आता है कि भले ही आपके पास सिर्फ 23 लोग हैं, लेकिन मौका पहले से ही 50% है कि उनमें से 2 का उसी दिन जन्मदिन है। " यह भी दूर का सच नहीं है। वहाँ एक 50% संभावना है कि 23 में से दो लोग एक ही जन्मदिन की सालगिरह है, के बारे में है नहीं एक ही जन्मदिन।
रॉन मौपिन

5
myserver% perl -e 'for ($i=0;$i<6;$i++){@m[$i]=int(rand(256));} printf "%X:%X:%X:%X:%X:%X\n",@m;'
55:C2:A5:FA:17:74

आह, ऑल ' स्विस आर्मी चेनसॉ फिर से सवारी करता है। और संस्करण 0.2 के माध्यम से, मैं पहली बार ओक्टेट होने के बारे में अनजाने में वूमल के उत्कृष्ट बिंदु को चुरा रहा हूं:

myserver% perl -e 'for ($i=0;$i<5;$i++){@m[$i]=int(rand(256));} printf "02:%X:%X:%X:%X:%X\n",@m;'
02:8E:94:A3:47:26

धन्यवाद MadHatter, मैंने आपके दूसरे संस्करण की कोशिश की और यह काम कर गया। बहुत अच्छा!
एरिक Sjölund

5

ये वेरिएंट भी काम करते हैं।

लंबे समय तक:

openssl rand -hex 6 | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'

या इससे कम:

openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/:$//'

दोनों वेरिएंट की लोड खपत समय के साथ त्वरित माप के अनुसार बहुत समान है।


हाय एंथनी, मुझे यहां कोई अन्य वैरिएंट ओपनस्नल रैंड और सेड नहीं मिल रहा है, इसलिए इस विषय में यह एक अनूठा समाधान है।
जारोस्लाव कुचेरा

यह सच है। वह / वह के fold -w2|paste -sd: -बजाय इस्तेमाल किया sedsedसमाधान शायद के रूप में यह एक अधिक परिचित उपकरण का उपयोग करता है याद करने के लिए आसान है - हालांकि मैं उसकी / उसके जवाब से अधिक सीखा है।
एंथोनी जी -

मुझे लगता है कि पहला कमांड काम नहीं करेगा क्योंकि यह पहला बिट सेट भी नहीं करता है!
आम्र्स जूल

हाय @amx, क्या आपको यकीन है कि मैक का पहला बिट भी होना चाहिए? मेरे पास मेरे एक सर्वर में एनआईसी है, जो ecबाइनरी में 11101100 के साथ शुरू होता है ...
जारोस्लाव

1
Hi @JaroslavKucera, Unicast MAC पतों को कभी भी पहली बाइट में 1 का स्थान निर्धारित नहीं करना चाहिए। वह "समूह" (मल्टीकास्ट / प्रसारण) बिट है। यदि आप अपना स्वयं का मैक पता बनाते हैं, तो आपको पहले बाइट में 2 का स्थान बिट ("स्थानीय रूप से प्रशासित" बिट) सेट करना है, इसे विश्व स्तर पर अद्वितीय मैक पते की गारंटी से अलग करना है।
आम्र्स

4

मुझे पता है कि यह पोस्ट पुरानी है, लेकिन भविष्य के आगंतुकों के लिए, यदि आप OUI के रूप में 0x02 तक सीमित किए बिना एक क्रिप्टोग्राफिक रूप से सुरक्षित छद्म रूप से मैक पते चाहते हैं, तो यहां एक तेज़ मंच प्लेटिनम जनरेटर है:

$ printf '%02x' $((0x$(od /dev/urandom -N1 -t x1 -An | cut -c 2-) & 0xFE | 0x02)); od /dev/urandom -N5 -t x1 -An | sed 's/ /:/g'

2

यहाँ एक और एक है, जो ज़ोंबी के उत्तर पर आधारित है:

macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr

Md5sum के माध्यम से यूरेनियम के उत्पादन को चलाने की कोई आवश्यकता नहीं है; आप बस हारून टोपनो के जवाब के अनुसार ओडी का उपयोग कर सकते हैं।
Womble

2

यहां पांच अन्य विकल्प दिए गए हैं, जिनमें से सभी सबसे महत्वपूर्ण बाइट के कम से कम महत्वपूर्ण बिट के लिए यादृच्छिक बिट्स का उपयोग करते हैं जो इंगित करता है कि क्या पता यूनिकास्ट या मल्टीकास्ट है और सबसे महत्वपूर्ण बाइट के दूसरे-कम से कम महत्वपूर्ण बिट के लिए जो पता बताता है कि क्या है सार्वभौमिक या स्थानीय रूप से प्रशासित।

jot -w%02X -s: -r 6 1 256
openssl rand -hex 6|fold -w2|paste -sd: -
od -N6 -tx1 -An /dev/random|awk '$1=$1'|tr \  :
god -N6 -tx1 -An /dev/random|cut -c2-|tr \  :
hexdump -n6 -e'/1 ":%02X"' /dev/random|cut -c2-

jotओएस एक्स और बीएसडी के साथ आता है लेकिन अधिकांश लिनक्स वितरण के साथ नहीं। में jot -wप्रारूप बदलता है, -sविभाजक बदलता है, और -rयादृच्छिक संख्या उत्पन्न करता है।

odPOSIX में है, लेकिन hexdumpनहीं है।

OS X के नीचे od( /usr/bin/odनीचे) GNU से भिन्न आउटपुट स्वरूप का उपयोग करता है od:

$ /usr/bin/od -N6 -tx1 -An /dev/random|tr ' ' :
:::::::::::d9::b9::d7::da::5f::96::::::::::::::::::::::::::::::::::::::::
$ god -N6 -tx1 -An /dev/random|tr ' ' :
:f5:6d:0a:3b:39:f9

odएक इनपुट फ़ाइल के लिए तर्क के बाद रखे गए OS X के विकल्पों को इनपुट फ़ाइलों के नाम के रूप में माना जाता है, इसलिए हारून टोपोन्से द्वारा जवाब में दिए गए आदेश /dev/urandomओएस एक्स के साथ अनिश्चित काल से पढ़ते हैं od


1

आप $ FQDN के बाद केवल $ RANDOM जोड़ सकते हैं और इससे आपको हर बार इसे चलाने के दौरान यादृच्छिक मैक पते मिलेंगे। यह विशेष रूप से पॉपी के लिए सहायक है जो स्नैपशॉट या वीएमएस के क्लोन का उपयोग करके बैकअप vms बनाना चाहते हैं।

macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')

1
ध्यान दें कि $ रैंडम बाश में उपलब्ध है, लेकिन अन्य गोले में उपलब्ध नहीं हो सकता है।
माइकल हैम्पटन


0

पायथन वन-लाइनर:

python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'

0

बस मज़े के लिए, यहाँ एक शुद्ध बैश संस्करण है, जिसे बैश 4.4.12 (1) -रेज़ के खिलाफ परीक्षण किया गया है:

read -N6 b </dev/urandom
LC_ALL=C printf "%02x:%02x:%02x:%02x:%02x:%02x\n" "'${b:0:1}" "'${b:1:1}" "'${b:2:1}" "'${b:3:1}" "'${b:4:1}" "'${b:5:1}"

पहली पंक्ति से 6 वर्ण पढ़े जाते हैं /dev/urandom; फिर सी वर्ण सेट का उपयोग करके एक वर्ण के साथ अलग किए गए प्रत्येक वर्ण का 0-भरा हेक्स मान प्रिंट करें (मान को प्रिंट करने के लिए नई पंक्ति वैकल्पिक लेकिन उपयोगी है)।

Printf का उपयोग करके वर्ण का मान निकालना POSIX प्रिंटफ प्रलेखन में परिभाषित किया गया है :

यदि अग्रणी चरित्र एकल-उद्धरण या डबल-उद्धरण है, तो मूल्य एकल-उद्धरण या दोहरे-उद्धरण के बाद वर्ण के अंतर्निहित कोडसेट में संख्यात्मक मान होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.