উত্তর:
এখানে একটি মাছ আছে।
এই শেল স্ক্রিপ্টটি আপনি খুঁজছেন এমন এলোমেলো স্ট্রিং উত্পন্ন করবে:
#!/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
আমার এখানে কিছু ছিল যা এটি দেখিয়েছিল কীভাবে এটি কমান্ড লাইন থেকে চালানো যায়, তবে ডেনিস উইলিয়ামসনকে বিস্মৃত (তবে উন্নত) সমাধানের পরে দেখলাম যে লোকেরা যে উত্তর প্রত্যাশা করে সেটাই সেখানকার যেখানে তাদের কোনও কাজ করতে হবে না is নিজেদের.
অতীতে আমি এটি ব্যবহার করে করেছি:
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]
এটি কীভাবে কাজ করে তা এখানে:
%02X
একটি বড় হাতের অক্ষর দেবে।
#!/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 টি প্রশস্ত ক্ষেত্র ব্যবহার করে, তাই আপনাকে শূন্য প্যাডিংয়ের বিষয়ে চিন্তা করতে হবে না - কোনও মন্তব্যকে সম্বোধন করার জন্য সংশোধিত পদ্ধতি approach
00-60-2F-8B-5-2C
, 00-60-2F-A-71-97
, 00-60-2F-82-F1-4
।
স্ট্যান্ডার্ড সরঞ্জাম ব্যবহার করে
# 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 \ -)
সবার মধ্যে সংক্ষিপ্ততম হতে পারে।
#!/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 ''
- নতুন লাইনের অনুমতি দেয়-r
অনুমতি দেয় \
(এবং প্রায়শই সর্বদা এর সাথে অভ্যাস দ্বারা ব্যবহার করা উচিত read
)-%02x\n
আউটপুটকে আক্ষরিক হাইফেনের কারণ হিসাবে যদি যথাযথ হয় তবে শীর্ষস্থানীয় শূন্য সহ একটি দুই-অঙ্কের হেক্সাডেসিমাল সংখ্যা অনুসরণ করে। নিউলাইনটি এখানে অতিরিক্ত অতিরিক্ত এবং এটি বাদ দেওয়া যেতে পারে।read
একটি একক বাইট (পায় -n 1
) থেকে /dev/urandom
পরিসীমা 0 255 থেকে (ইন 00
করার FF
)।printf
লুপের সর্বশেষ আর্গুমেন্টের একক উদ্ধৃতিটি অক্ষরের আউটপুট হওয়ার কারণ হিসাবে এটির সংখ্যাসূচক মান হয় ("এ" আউটপুট "65" হিসাবে হয়)। যেখানে বলা হয়েছে তার জন্য পসিক্স স্পেসিফিকেশনprintf
দেখুন :
শীর্ষস্থানীয় অক্ষরটি যদি একক-উদ্ধৃতি বা ডাবল-উদ্ধৃতি হয় তবে মানটি একক-উদ্ধৃতি বা ডাবল-উদ্ধৃতি অনুসরণ করে অক্ষরের অন্তর্নিহিত কোডসেটের সংখ্যাসূচক মান হবে।
IFS= read …
09 0a এবং 20 (স্বাভাবিক আইএফএস চরগুলি) 00 এ ভাঁজ করা এড়ানো দরকার বলে মনে হচ্ছে
-d ''
। আমি আমার উত্তর ঠিক করব। আমাকে জানতে দেওয়ার জন্য ধন্যবাদ।
-r
যে সুরক্ষা দেয় তা পড়ে গেল। আমি চাই শেল প্রোগ্রামগুলিতে বাইনারি ডেটা সঠিকভাবে পরিচালনা করা এত স্পষ্টভাবে না হয় was 00 স্ট্রিংয়ের মাঝখানে সঠিকভাবে প্রতিনিধিত্ব করা অসম্ভব বলে মনে হচ্ছে। সুবিধাজনক (পরিকল্পিত?) মধ্যে সহযোগিতার শক্তি কর্মদক্ষতার দ্বারা তোমার একক-অক্ষর-এ-এ-সময় পদ্ধতি হ্যান্ডলগুলি 00 read
, স্ট্রিং ক্ষেপক এবং কিভাবে printf
একইরূপে এক-অক্ষর যুক্তি '
। দীর্ঘশ্বাস.
hexdump -C
।
আমি সবচেয়ে সংক্ষিপ্ততম উপায়ে আসতে পারি হেক্সডাম্প সরাসরি ব্যবহার করা using
echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
জিএনইউ / লিনাক্সে পরীক্ষিত
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
সামান্য খাটো :-)
আরেকটি এক লাইন সমাধান
$ 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
হেক্স আউটপুট, ASCII অক্ষর শৈলী, পছন্দসই হিসাবে।
/dev/urandom
লিনাক্স কার্নেলের এলোমেলো সংখ্যা সিউডো-ফাইল।
হাইফেন প্রতিস্থাপনের জন্য স্থান (স্ট্রিম এডিটর)।
-e <SCRIPT>
সেড স্ক্রিপ্টটি কার্যকর করুন।
ত্রি (স্ট্রিং অনুবাদ) exampleচ্ছিক, এই উদাহরণে। আমি আমার স্ক্রিপ্ট / পরিবেশে আপার কেস ম্যাকের ঠিকানাগুলি পছন্দ করি।
#!/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
এই কাজ করা উচিত
echo 00-60-2f-`openssl rand -hex 3 | sed 's/\(..\)/\1-/g; s/.$//'`
end=$( echo $RANDOM | openssl md5 | sed 's/\(..\)/\1-/g' | cut -b-8 )
echo 00-60-2f-$end
এটি এক হিসাবে কাজ করে। প্রয়োজনীয় হিসাবে আউটপুট সমস্ত উচ্চ ক্ষেত্রে হয়।
openssl rand -hex 3 | sed 's/\(..\)\(..\)\(..\)/00-60-2F-\1-\2-\3/' | tr [a-f] [A-F]
এটি ক্লাসিক শেল ( #!/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
অন্য বিকল্পটি হ'ল 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 \ -)
ওএস এক্স এর od
( /usr/bin/od
নীচে) জিএনইউ থেকে আলাদা আউটপুট ফর্ম্যাট ব্যবহার করে od
:
$ /usr/bin/od -N3 -tx1 -An /dev/random|tr ' ' -
-----------c7--fd--55----------------------------------------------------
$ god -N3 -tx1 -An /dev/random|tr ' ' -
-94-9e-5c
jot -w%02X -s- -r 3 1 256
করে সম্পাদনা করেছি jot -w%02X -s- -r 3 0 256
।
লিনাক্সে:
printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
ব্যাখ্যা:
লিনাক্সে আপনি যখনই এটি পড়েন ততবার/proc/sys/kernel/random/uuid
একটি নতুন টাইপ 4 (এলোমেলো) ইউইউডি ফেরত দেয়। এর বেশিরভাগ অক্ষর হ'ল (ছদ্ম) এলোমেলো হেক্সাডেসিমাল অঙ্ক, সুতরাং আমরা সেগুলি ব্যবহার করতে পারি। উদাহরণ:
$ 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
এবং cut
পসিএক্স সরঞ্জামগুলি;কনস:
/proc/sys/kernel/random/uuid
কিছু সিস্টেমে উপলব্ধ নাও হতে পারে;
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'