ฉันจะสร้างที่อยู่ MAC แบบสุ่มจากบรรทัดคำสั่ง Linux ได้อย่างไร
ฉันค้นหาโซลูชันที่ต้องใช้เครื่องมือมาตรฐานทั่วไปที่พบในบรรทัดคำสั่ง Linux
ที่อยู่ MAC จะถูกใช้สำหรับแขก KVM
ฉันจะสร้างที่อยู่ MAC แบบสุ่มจากบรรทัดคำสั่ง Linux ได้อย่างไร
ฉันค้นหาโซลูชันที่ต้องใช้เครื่องมือมาตรฐานทั่วไปที่พบในบรรทัดคำสั่ง Linux
ที่อยู่ MAC จะถูกใช้สำหรับแขก KVM
คำตอบ:
ฉันใช้
macaddr=$(echo $FQDN|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
ประโยชน์ของวิธีนี้ซึ่งเป็นตัวเลขสุ่มโดยสมบูรณ์ก็คือมันเป็นไปได้ที่จะสร้างที่อยู่ MAC ได้อย่างน่าเชื่อถือตาม FQDN ของเครื่องซึ่งฉันพบว่ามีประโยชน์ในบางครั้ง 02
สำหรับ octet แรกเพียงแค่ตั้งค่า "ที่ได้รับมอบหมายในประเทศ" บิตซึ่งจะทำให้มันเห็นได้ชัดว่ามันไม่ได้เป็นผู้จัดจำหน่ายอยู่ MAC และรับประกันว่าคุณจะไม่ชนกับที่อยู่ MAC จริงของ NIC
หากคุณต้องการสร้างที่อยู่ MAC หลายรายการต่อโฮสต์ฉันใช้เชื่อม FQDN กับชื่อบริดจ์เพื่อเชื่อมต่อส่วนต่อประสานกับ นี่เป็นงานที่ดีในการกระจายสิ่งต่าง ๆ สำหรับนิคส์ที่แตกต่างกัน
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
สคริปต์ที่โพสต์นั้นดี แต่ฉันต้องการเพิ่มคำเตือน: Mind the Birthday (Paradoxon)!
มันมาจากข้อเท็จจริงที่ว่าแม้ว่าคุณจะมีเพียง 23 คน แต่โอกาส 50% ที่พวกเขา 2 คนมีวันเกิดในวันเดียวกัน
มันขึ้นอยู่กับสถานการณ์ของคุณว่าคุณใช้มันอย่างไร แต่ถ้าคุณสร้าง MACS แบบสุ่มที่ประมาณ 1 ล้านโอกาสที่จะมีการชนหมายเลข Mac คือ 40% ที่ 2 ล้านมันเป็น 87% แล้ว!
หากคุณต้องการเพียงสองสามข้อนี้ก็โอเค แต่เมื่อคุณบำรุงรักษาเซิร์ฟเวอร์ฟาร์มที่มีเซิร์ฟเวอร์หลายร้อยเซิร์ฟเวอร์แต่ละแห่งจะโฮสต์เครื่องเสมือนหลายสิบเครื่องหรือหากคุณใช้ macs เป็นดัชนีในฐานข้อมูลบางส่วนสำหรับการทำบัญชีและคุณต้องใช้ความระมัดระวัง !
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
Ah, Chainsaw ol ' Swiss Armyขี่อีกครั้ง และตามเวอร์ชั่น 0.2 ฉันได้ขโมยจุดยอดเยี่ยมของ womble อย่างไม่น่าเชื่อเกี่ยวกับ octet แรกที่ 02:
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
ตัวแปรเหล่านี้ทำงานเช่นกัน
อีกต่อไป:
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: -
sed
การsed
แก้ปัญหานั้นอาจจะง่ายกว่าที่จะจำได้เพราะใช้เครื่องมือที่คุ้นเคยมากกว่า - แม้ว่าฉันจะเรียนรู้เพิ่มเติมจากคำตอบของเขา / เธอ
ec
ดังนั้น 11101100 ในไบนารี ...
ฉันรู้ว่าโพสต์นี้เก่า แต่สำหรับผู้เยี่ยมชมในอนาคตหากคุณต้องการที่อยู่ MAC หลอกแบบเข้ารหัสลับโดยไม่ จำกัด 0x02 ในฐานะ OUI นี่เป็นตัวสร้างผู้ไม่เชื่อเรื่องพระเจ้าแพลตฟอร์มที่รวดเร็วเป็นส่วนใหญ่:
$ 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'
นี่คืออีกหนึ่งตามคำตอบของ wombie:
macaddr=$(dd if=/dev/urandom bs=1024 count=1 2>/dev/null|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\)\(..\).*$/\1:\2:\3:\4:\5:\6/')
echo $macaddr
นี่คือห้าตัวเลือกอื่น ๆ ทั้งหมดใช้บิตสุ่มสำหรับบิตที่มีนัยสำคัญน้อยที่สุดของไบต์ที่สำคัญที่สุดที่ระบุว่าที่อยู่เป็น Unicast หรือ multicast และสำหรับบิตที่มีนัยสำคัญน้อยที่สุดที่สองของไบต์ที่สำคัญที่สุดที่ระบุว่าที่อยู่คือ บริหารในระดับสากลหรือระดับท้องถิ่น
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
มาพร้อมกับ OS X และ BSD แต่ไม่มีใน Linux ดิสทริบิวชันส่วนใหญ่ ในjot
-w
การเปลี่ยนรูปแบบ-s
ให้เปลี่ยนตัวคั่นและ-r
สร้างตัวเลขสุ่ม
od
อยู่ใน POSIX แต่hexdump
ไม่ใช่
OS X's 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
ใน OS X ของod
ตัวเลือกวางหลังจากอาร์กิวเมนต์สำหรับแฟ้มใส่จะถือว่าเป็นชื่อของแฟ้มใส่ดังนั้นคำสั่งในคำตอบโดยแอรอน Toponce ที่อ่านจาก/dev/urandom
ไปเรื่อย ๆ พร้อม OS od
X
คุณสามารถเพิ่ม $ RANDOM หลังจาก $ FQDN และนี่จะให้ที่อยู่ mac แบบสุ่มทุกครั้งที่คุณเรียกใช้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับคน poeple ที่ต้องการสร้าง vms สำรองโดยใช้ snapshot หรือโคลนของ vms
macaddr=$(echo $FQDN$RANDOM|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
ฉันใช้:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Python หนึ่งซับ:
python3 -c 'import os; print(":".join(["{:02x}".format(x) for x in b"\02x" + os.urandom(5)]))'
เพื่อความสนุกนี่คือเวอร์ชั่นทุบตีแท้ทดสอบกับ Bash 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
; จากนั้นใช้ชุดอักขระ C พิมพ์ค่าเลขฐานสิบหกที่เต็มไปด้วย 0 ของอักขระแต่ละตัวที่คั่นด้วยเครื่องหมายโคลอน (ขึ้นบรรทัดใหม่เป็นทางเลือก แต่มีประโยชน์ในการพิมพ์ค่า)
การแยกค่าของอักขระโดยใช้ printf ถูกกำหนดไว้ในเอกสารประกอบPOSIX printf :
หากอักขระนำหน้าเป็นเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่ค่าจะเป็นค่าตัวเลขในชุดโค้ดพื้นฐานของอักขระตามเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่