बैश शेल के साथ एक वैध यादृच्छिक मैक पता कैसे उत्पन्न करें


16

मैं बैश के साथ एक वैध यादृच्छिक मैक एड्रेस कैसे उत्पन्न कर सकता हूं।

एड्रेस के पहले आधे हिस्से को हमेशा इसी तरह रहना चाहिए

00-60-2F-xx-xx-xx

बस x मान यादृच्छिक उत्पन्न किया जाना चाहिए?


9
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'
13

1
@artistoex यह सुंदर था ... आपने उस उत्तर के रूप में पोस्ट क्यों नहीं किया?
bobmagoo

जवाबों:


18

यहाँ एक मछली है।

यह शेल स्क्रिप्ट आपके द्वारा खोजा जाने वाला यादृच्छिक स्ट्रिंग उत्पन्न करेगा:

#!/bin/bash
hexchars="0123456789ABCDEF"
end=$( for i in {1..6} ; do echo -n ${hexchars:$(( $RANDOM % 16 )):1} ; done | sed -e 's/\(..\)/-\1/g' )
echo 00-60-2F$end

मेरे पास बस कुछ ऐसा था, जिसमें दिखाया गया था कि इसे कमांड लाइन से कैसे चलाया जाता है, लेकिन डेनिस विलियमसन को दृढ़ (लेकिन अपवर्तित) समाधान को देखने के बाद मैं देखता हूं कि लोगों को उम्मीद है कि जवाब वही है जहां उन्हें कोई काम नहीं करना है खुद को।


यह महसूस करने के लिए धन्यवाद कि मैं चम्मच से दूध पिलाने के बजाय उसे मछली बनाना
सीखाने की

1
आप हमेशा अपने उत्तर की व्याख्या कर सकते हैं ताकि आप दोनों उसे सिखा रहे हों कि इस समय के आसपास मछली उपलब्ध कराने के अलावा ...
जेड डेनियल

यह स्क्रिप्ट hbdgaf द्वारा प्रस्तावित एक की तुलना में काफी तेज चलती है और 1000 बार लूप में कोई भी अमान्य मैक एड्रेस उत्पन्न नहीं करता है। धन्यवाद!
ब्रूनो फिंगर

1
आपके समाधान काम करता है और केवल 3 लाइनें हैं। मै बिक चुका हूँ।
रिचर्ड गोम्स

17
  1. एक उचित आकार का इंट उत्पन्न करें जैसे: http://tldp.org/LDP/abs/html/randomvar.html
  2. हेक्स में परिवर्तित करें जैसे: http://snipplr.com/view/2428/convert-from-int-to-hex/
  3. तीन बेतरतीब ढंग से उत्पन्न विखंडू के बीच डैश जोड़ें
#!/bin/bash
RANGE=255
#set integer ceiling

number=$RANDOM
numbera=$RANDOM
numberb=$RANDOM
#generate random numbers

let "number %= $RANGE"
let "numbera %= $RANGE"
let "numberb %= $RANGE"
#ensure they are less than ceiling

octets='00-60-2F'
#set mac stem

octeta=`echo "obase=16;$number" | bc`
octetb=`echo "obase=16;$numbera" | bc`
octetc=`echo "obase=16;$numberb" | bc`
#use a command line tool to change int to hex(bc is pretty standard)
#they're not really octets.  just sections.

macadd="${octets}-${octeta}-${octetb}-${octetc}"
#concatenate values and add dashes

echo $macadd
#echo result to screen
#note: does not generate a leading zero on single character sections.  easily remediedm but that's an exercise for you

या अजगर में:

from random import randint
def gen_mac_char():
  return hex((randint(0,16))).split('x')[1]
def gen_mac_pair():
  return ''.join([gen_mac_char(), gen_mac_char()])
def gen_last_half_mac(stem):
  return '-'.join([stem, gen_mac_pair(), gen_mac_pair(), gen_mac_pair()])
print(gen_last_half_mac('00-60-2F'))

ध्यान दें कि अजगर संस्करण केवल एक हेक्स चर उत्पन्न करने के लिए 16 विस्तृत क्षेत्र का उपयोग करता है, इसलिए आपको किसी टिप्पणी को संबोधित करने के लिए शून्य पैडिंग के बारे में चिंता करने की आवश्यकता नहीं है।


अतिरिक्त +1 यदि आप प्रत्येक का एक उदाहरण प्रदान करते हैं (मुझे पता है कि आप उसे मछली कैसे सिखा रहे हैं, लेकिन आप उसे एक साथ रखने के लिए पहेली के टुकड़े दे सकते हैं, और बता सकते हैं कि वे कैसे / क्यों काम करते हैं)।
जेड डेनियल

@ जैद डेनियल - किया और किया। कोड प्रदान किया गया।
रोबोटहुम्स

यह कोड मेरे लिए कुछ अमान्य मैक उत्पन्न कर रहा है। यह 1000 बार पाशन मैं जैसे कुछ MACs मिला 00-60-2F-8B-5-2C, 00-60-2F-A-71-97, 00-60-2F-82-F1-4
ब्रूनो फिंगर

यह सिर्फ कुछ था जिसे मैं ओपी के बैश पर जोर देकर कह रहा था। आप कह रहे हैं कि आप एक अंक को शून्य अधिकार के साथ पैड करने का तरीका नहीं जान सकते हैं? @ ब्रूनोफिंगर
रोबोटहुमंस

आसानी से 255 के बजाय 16 का उपयोग करने और शून्य प्लेसहोल्डर उत्पन्न करने के लिए पुन: काम किया जा सकता है। यह सिर्फ और अधिक लाइनें है ...
रोबॉटहंसन

15

अतीत में मैंने इसका उपयोग किया है:

echo 00-60-2F-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]

लेकिन यह केवल उन्हें 0-9 की रेंज में बना देगा। मेरे उद्देश्यों के लिए, यह काफी अच्छा था।

संभवतः प्रिंटफ का उपयोग करने के लिए एक बेहतर समाधान होगा:

printf '00-60-2F-%02X-%02X-%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]

यहां बताया गया है कि यह कैसे काम करता है:

  • प्रिंटफ़ कार्यक्रम C "प्रिंटफ़" फ़ंक्शन पर आधारित है, जो पहले पैरामीटर के रूप में "प्रारूप स्ट्रिंग" लेता है और फिर प्रारूप स्ट्रिंग में अतिरिक्त पैरामीटर भरते हैं।
  • प्रारूप स्ट्रिंग में% एक "प्रारूप निर्दिष्टकर्ता" पेश करता है जो एक या एक से अधिक वर्णों को यह बता सकता है कि तर्कों को कैसे प्रारूपित किया जाए।
  • एक प्रारूप शून्य में एक अग्रणी शून्य (0) का मतलब है कि परिणामी संख्यात्मक आउटपुट को निर्दिष्ट चौड़ाई तक अग्रणी शून्य के साथ गद्देदार किया जाना चाहिए।
  • 2 का कहना है कि विनिर्देशक को चौड़ाई के लायक दो अक्षर लेने चाहिए।
  • एक्स स्पेसियर को समाप्त करता है और दर्शाता है कि इसे एक संख्या के रूप में व्याख्या किया जाना चाहिए और हेक्सिडेसिमल के रूप में प्रदर्शित किया जाना चाहिए। क्योंकि यह अपर-केस है, एफआर अपर केस होना चाहिए।
  • \ N एक नई पंक्ति है - प्रिंटफ़ बैकस्लैश को एक एस्केप कोड के रूप में व्याख्यायित करता है जिसका उपयोग अन्य वर्णों को प्रदर्शित करने के लिए किया जा सकता है, अक्सर नई तरह के ट्रिकी वर्ण।
  • प्रारूप विनिर्देशक में शेष अक्षर शाब्दिक रूप से छपे हैं, इसमें प्रारंभिक "00-06-2F-" और प्रारूप विनिर्देशक के बीच डैश शामिल हैं।
  • शेष तर्क शेल परिवर्तनीय प्रतिस्थापन ($ द्वारा चिह्नित) हैं और इसमें एक गणित अभिव्यक्ति शामिल है जो एक यादृच्छिक संख्या (रैंडम) मोडुलो 256 है। इसका परिणाम 0 और 255 के बीच एक यादृच्छिक संख्या में होता है।

2
User58033 के रूप में सही जवाब में बताया (जो अब जा सकता है): %02Xएक ऊपरी मामले पत्र देंगे।
अर्जन

आह, अच्छी बात है। मैंने बताया कि मूल प्रश्न ने ऊपरी मामले का उपयोग करके एक उदाहरण दिया। स्वागत के लिए धन्यवाद। :-)
सीन रिफ़्शिनडर

अतिरिक्त +1 यदि आप बता सकते हैं कि क्या हो रहा है और आपका समाधान क्यों काम कर रहा है।
जेड डेनियल

वहां तुम जाओ, @ जेद।
सीन रिफ़्स्चाइडर

12

या तो मानक उपकरण का उपयोग करना

# output in capitals
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random

या

# output in lower case letters
echo 00-60-2f$(od -txC -An -N3 /dev/random|tr \  -)

सब से छोटा हो सकता है।


क्या आप अपने उत्तर में बता सकते हैं कि वास्तव में क्या होता है? यह अन्य तरीकों से भी इसका उपयोग करने में मदद करेगा!
ब्रूनो बीरी

7
#!/bin/bash
LC_CTYPE=C
MAC=00-60-2F
for i in {1..3}
do
    IFS= read -d '' -r -n 1 char < /dev/urandom
    MAC+=$(printf -- '-%02x\n' "'$char")
done
printf '%s\n' "$MAC"

इस काम करने के तरीके की कुंजी:

  • LC_CTYPE=C - वर्ण> 0x7F की अनुमति देता है
  • IFS=- \t(टैब), \n(न्यूलाइन) और स्पेस की व्याख्या को निष्क्रिय करता है
  • -d ''- newlines अनुमति देता है
  • -rअनुमति देता है \(और लगभग हमेशा आदत से इस्तेमाल किया जाना चाहिए read)
  • यदि प्रारूप -%02x\nउचित हो, तो आउटपुट एक शाब्दिक हाइफ़न हो सकता है, जिसके बाद दो अंकों के हेक्साडेसिमल नंबर एक अग्रणी शून्य सहित हो, यदि उपयुक्त हो। यहां नईलाइन शानदार है और इसे छोड़ा जा सकता है।
  • readएक एकल बाइट (हो जाता है -n 1) से /dev/urandomसीमा 0 से 255 (में 00करने के लिए FF)।
  • printfलूप में अंतिम तर्क में एकल उद्धरण वर्ण को आउटपुट के रूप में इसका संख्यात्मक मान ("ए" आउटपुट "65") के रूप में उत्पन्न करता है। जहां यह कहता है, उसके लिए POSIX विनिर्देशprintf देखें :

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


यह IFS= read …० ९ ० एए और २० (सामान्य आईएफएस चार्ट) को ०० में तह करने से बचने की आवश्यकता प्रतीत होती है।
क्रिस जॉन्सन

@ क्रिस: क्षमा करें, मैंने कुछ डबल चेकिंग करते समय कुछ चीजों को बाहर निकाल लिया और उन्हें वापस रखना भूल गया -d ''। मैं अपना उत्तर ठीक करूंगा। मुझे बताने के लिए धन्यवाद।
डेनिस विलियमसन

उफ़, यह सुरक्षित है -rकि `` बाहर गिर गया। मैं चाहता हूं कि शेल कार्यक्रमों में बाइनरी डेटा की उचित हैंडलिंग इतनी फ़िज़ूल नहीं थी। । स्ट्रिंग के मध्य में 00 का सही प्रतिनिधित्व करना असंभव लगता है। आपके एकल-चरित्र-ऑन-टाइम विधि 00 को सुविधाजनक (डिज़ाइन किए गए?) सहयोग read, स्ट्रिंग इंटरपोलेशन और कैसे printfएक-वर्ण तर्क का व्यवहार करता है , के द्वारा 00 हैंडल करता है '। आह।
क्रिस जॉन्सन

@ क्रिस: काश मेरे DWIM प्रोसेसर फ्रिट्ज पर नहीं होता। वैसे, आपको एक शुद्ध बैश स्क्रिप्ट देखने में दिलचस्पी हो सकती है जो मैंने लिखा था कि की मुख्य कार्यक्षमता को डुप्लिकेट करता है hexdump -C
डेनिस विलियमसन 21

अतिरिक्त +1 यदि आप बता सकते हैं कि क्या हो रहा है और आपका समाधान क्यों काम कर रहा है।
जेड डेनियल

7

सबसे छोटा तरीका जिससे मैं आ सकता था वह सीधे हेक्सडंप का उपयोग कर रहा था

echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
  • -33 हेक्सडम्प को तीन बायटीज़ पढ़ने के लिए कहता है
  • प्रारूप स्ट्रिंग प्रत्येक बाइट के लिए डैश और दो अंकों के हेक्स मान को प्रिंट करता है
    • '/ 1' का मतलब है कि हर रीड बाइट के लिए प्रारूप लागू करें
    • "-% 02X" एक अग्रणी शून्य, दो अंक, ऊपरी मामले में हेक्स मान को प्रिंट करने के लिए एक प्रिंटफ कल्पना है
  • / dev / random एक स्रोत यादृच्छिक बाइट्स है

जीएनयू / लिनक्स पर परीक्षण किया गया


काम पर यूनिक्स प्रभावशीलता :-)
कलाकार

hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/randomथोड़ा छोटा है :-)
कलाकार

4

एक और एक लाइन समाधान

$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g'

ऊपरी मामले में एक ही बात

$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g' | tr '[:lower:]' '[:upper:]'

इसे बैश पर्यावरण चर के लिए उत्पन्न करें

$ export MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g')
$ echo $MAC

विवरण:

  • ओडी (ओक्टल डंप)

    -Anआउटपुट के प्रमुख पता प्रतिनिधित्व (अतिरिक्त शोर) को दबा देता है।
    -N3आउटपुट को तीन बाइट्स तक सीमित करें।
    -t xCवांछित के रूप में हेक्स, एएससीआईआई चरित्र शैली में आउटपुट।
    /dev/urandomलिनक्स कर्नेल यादृच्छिक संख्या छद्म फ़ाइल।

  • sed (धारा संपादक) स्थान के लिए स्थानापन्न प्रतिस्थापन के लिए।

    -e <SCRIPT> सिड स्क्रिप्ट निष्पादित करें।

  • tr (स्ट्रिंग अनुवाद) वैकल्पिक, इस उदाहरण में। मुझे अपनी स्क्रिप्ट्स / वातावरण में ऊपरी स्थिति मैक पते पसंद हैं।


2
#!/bin/bash
#Creates an array containing all hexadecimal characters
HEX=(a b c d e f 0 1 2 3 4 5 6 7 8 9)
#Defines MAC string length as 0 (total SL will be 17)
SL=0
#Loop sequentially assigns random hex characters in pairs until a full
#MAC address is generated.
while [ $SL -lt 17 ]
do
        num=`shuf -i 0-15 -n 1` #Generates random number which will be used as array index
        RMAC="$RMAC""${HEX[$num]}" #Uses the randomly generated number to select a hex character
        num=`shuf -i 0-15 -n 1` #New random number
        RMAC="$RMAC""${HEX[$num]}" #Appends second hex character
        SL=$[`echo $RMAC | wc -c` - 1] #Calculates SL and stores in var SL
    if [ $SL -lt 17 ] #If string is uncomplete, appends : character
            then
            RMAC=""$RMAC":"
    fi
done
echo $RMAC #Displays randomly generated MAC address

2

यह काम करना चाहिए

echo 00-60-2f-`openssl rand -hex 3 | sed 's/\(..\)/\1-/g; s/.$//'`



0

यह क्लासिक शेल ( #!/bin/sh) स्क्रिप्ट में काम करता है :

random_mac() {
    printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -6
}

या, यदि आप कस्टम उपसर्ग करना चाहते हैं:

random_mac_with_prefix() {
    echo -n "00:60:2f:" &&
    printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -3
}

उदाहरण का उपयोग:

$ random_mac
96:ef:45:28:45:25
$ random_mac
7e:47:26:ae:ab:d4
$ random_mac_with_prefix 
00:60:2f:24:f4:18
$ random_mac_with_prefix 
00:60:2f:63:08:b2

0

एक अन्य विकल्प का उपयोग करना है jot:

echo 00-60-2F-$(jot -w%02X -s- -r 3 0 256)

-wस्वरूप -sबदलता है, विभाजक बदलता है, और -rयादृच्छिक संख्या उत्पन्न करता है।

odआर्टिस्टोएक्स और जीरो 2 एक्सएक्सएक्स द्वारा पोस्ट किए गए उत्तरों में उपयोग करने वाले कमांड ओएस एक्स के साथ आउटपुट में अतिरिक्त डैश जोड़ते हैं od, लेकिन यह नहीं करता है:

echo 00-60-2f-$(od -tx1 -An -N3 /dev/random|awk '$1=$1'|tr \  -)

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

$ /usr/bin/od -N3 -tx1 -An /dev/random|tr ' ' -
-----------c7--fd--55----------------------------------------------------

$ god -N3 -tx1 -An /dev/random|tr ' ' -
-94-9e-5c

1
जोत से सावधान रहें। मैं कुछ मैक इस तरह से उन में "100" है, जैसे 00-60-2F-100-ए 3-F6 उत्पन्न है ...
Petrus

@petrus आप सही हैं, मैंने बदलने के jot -w%02X -s- -r 3 1 256लिए उत्तर को संपादित किया jot -w%02X -s- -r 3 0 256
निसटामा

0

लिनक्स में:

printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid

स्पष्टीकरण:

लिनक्स में हर बार जब आप इसे पढ़ते हैं तो /proc/sys/kernel/random/uuidएक नया प्रकार 4 (यादृच्छिक) UUID देता है। इसके अधिकांश पात्र (छद्म) यादृच्छिक षोडश अंक हैं, इस प्रकार हम उनका उपयोग कर सकते हैं। उदाहरण के लिए:

$ cat /proc/sys/kernel/random/uuid
5501ab12-b530-4db5-a8ea-3df93043f172
$ #           ^    ^       Beware, these characters are not random.
$ #   ^^^^^            ^^^ Let's use characters on these positions.
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
6d-74-a1
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
13-f9-75

अब 00-60-2f-पहले प्रिंट करना (न्यूलाइन के बिना) करना काफी है :

$ printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
00-60-2f-86-f9-21

पेशेवरों:

  • हेक्साडेसिमल अंक बहुत शुरुआत से, कोई रूपांतरण / फ़िल्टरिंग की आवश्यकता;
  • printfऔर cutPOSIX उपकरण हैं;
  • (आपके विशिष्ट मामले के लिए) UUID में पहले से ही हाइफ़न, हम उनका उपयोग करते हैं।

विपक्ष:

  • हमें UUID में दो गैर-यादृच्छिक अंकों को ध्यान में रखना चाहिए;
  • /proc/sys/kernel/random/uuid कुछ सिस्टम पर उपलब्ध नहीं हो सकता है;
  • केवल लोअरकेस अक्षर इतने आसान आते हैं (आपको अपरकेस अक्षर प्राप्त करने के लिए अतिरिक्त कदम की आवश्यकता है)।

0

एक लाइनर (बैश)

mac=$(c=0;until [ $c -eq "6" ];do printf ":%02X" $(( $RANDOM % 256 ));let c=c+1;done|sed s/://)

नतीजा

$ echo $mac
93:72:71:0B:9E:89
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.