วิธีสร้างที่อยู่ MAC แบบสุ่มจากบรรทัดคำสั่ง Linux


26

ฉันจะสร้างที่อยู่ MAC แบบสุ่มจากบรรทัดคำสั่ง Linux ได้อย่างไร

ฉันค้นหาโซลูชันที่ต้องใช้เครื่องมือมาตรฐานทั่วไปที่พบในบรรทัดคำสั่ง Linux

ที่อยู่ MAC จะถูกใช้สำหรับแขก KVM

คำตอบ:


46

ฉันใช้

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

ประโยชน์ของวิธีนี้ซึ่งเป็นตัวเลขสุ่มโดยสมบูรณ์ก็คือมันเป็นไปได้ที่จะสร้างที่อยู่ MAC ได้อย่างน่าเชื่อถือตาม FQDN ของเครื่องซึ่งฉันพบว่ามีประโยชน์ในบางครั้ง 02สำหรับ octet แรกเพียงแค่ตั้งค่า "ที่ได้รับมอบหมายในประเทศ" บิตซึ่งจะทำให้มันเห็นได้ชัดว่ามันไม่ได้เป็นผู้จัดจำหน่ายอยู่ MAC และรับประกันว่าคุณจะไม่ชนกับที่อยู่ MAC จริงของ NIC

หากคุณต้องการสร้างที่อยู่ MAC หลายรายการต่อโฮสต์ฉันใช้เชื่อม FQDN กับชื่อบริดจ์เพื่อเชื่อมต่อส่วนต่อประสานกับ นี่เป็นงานที่ดีในการกระจายสิ่งต่าง ๆ สำหรับนิคส์ที่แตกต่างกัน


+1 สำหรับการทำซ้ำ; สำหรับแอปพลิเคชันบางอย่างซึ่งทำให้เป็นวิธีที่เหนือชั้นกว่าสำหรับฉัน
MadHatter สนับสนุนโมนิก้า

ขอบคุณมากฉันชอบความคิดที่จะให้มันทำซ้ำได้
Erik Sjölund

รวมทั้งไม่มีที่อยู่ Mac ขัดแย้งกันในเหตุการณ์ที่ไม่น่าเป็นไปได้ที่คุณจะสุ่มสร้าง Mac เครื่องเดียวกันสองครั้ง
Petter H

3
คุณสามารถใช้แทนtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
เป็นเพียง "ทางเลือก" ในแง่ที่ว่ามันให้ผลลัพธ์ที่แตกต่างอย่างสิ้นเชิงกับสิ่งที่ตัวอย่างของฉันทำ ...
womble

8

สคริปต์ที่โพสต์นั้นดี แต่ฉันต้องการเพิ่มคำเตือน: Mind the Birthday (Paradoxon)!

มันมาจากข้อเท็จจริงที่ว่าแม้ว่าคุณจะมีเพียง 23 คน แต่โอกาส 50% ที่พวกเขา 2 คนมีวันเกิดในวันเดียวกัน

มันขึ้นอยู่กับสถานการณ์ของคุณว่าคุณใช้มันอย่างไร แต่ถ้าคุณสร้าง MACS แบบสุ่มที่ประมาณ 1 ล้านโอกาสที่จะมีการชนหมายเลข Mac คือ 40% ที่ 2 ล้านมันเป็น 87% แล้ว!

หากคุณต้องการเพียงสองสามข้อนี้ก็โอเค แต่เมื่อคุณบำรุงรักษาเซิร์ฟเวอร์ฟาร์มที่มีเซิร์ฟเวอร์หลายร้อยเซิร์ฟเวอร์แต่ละแห่งจะโฮสต์เครื่องเสมือนหลายสิบเครื่องหรือหากคุณใช้ macs เป็นดัชนีในฐานข้อมูลบางส่วนสำหรับการทำบัญชีและคุณต้องใช้ความระมัดระวัง !


ขอบคุณสำหรับคำเตือนเกี่ยวกับวันเกิดความขัดแย้ง! ในกรณีของฉันฉันจะเสี่ยงเพราะฉันจะสร้างที่อยู่ MAC ประมาณ 20 ที่
Erik Sjölund

3
หากคุณใช้เซิร์ฟเวอร์หลายร้อยเครื่องแต่ละแห่งที่โฮสต์เครื่องเสมือนหลายสิบเครื่องบนโดเมนออกอากาศเดียวกันคุณมีปัญหาที่ใหญ่กว่าความเสี่ยงของการชนที่อยู่ MAC
womble

1
" มันมาจากความจริงที่ว่าแม้ว่าคุณจะมีเพียง 23 คน แต่โอกาส 50% ที่พวกเขา 2 คนมีวันเกิดในวันเดียวกัน " นั่นไม่ใช่ความจริงจากระยะไกล มีโอกาส 50% ที่คนสองคนใน 23 คนมีวันคล้ายวันเกิดครบรอบวันเกิดไม่ใช่วันเกิดเดียวกัน
Ron Maupin

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

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

ขอบคุณ MadHatter ฉันลองใช้ชุดที่สองของคุณและใช้งานได้ ดีมาก!
Erik Sjölund

5

ตัวแปรเหล่านี้ทำงานเช่นกัน

อีกต่อไป:

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

หรือสั้นกว่า:

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

ปริมาณการใช้โหลดของตัวแปรทั้งสองนั้นคล้ายคลึงกันมากตามการวัดที่รวดเร็วตามเวลา


สวัสดีแอนโทนี่ฉันไม่เห็นตัวแปรอื่น ๆ ที่รวม openssl rand และ sed ที่นี่ดังนั้นนี่เป็นคำตอบที่ไม่ซ้ำกันในหัวข้อนี้
Jaroslav Kucera

นั่นเป็นเรื่องจริง เขา / เธอใช้แทนfold -w2|paste -sd: - sedการsedแก้ปัญหานั้นอาจจะง่ายกว่าที่จะจำได้เพราะใช้เครื่องมือที่คุ้นเคยมากกว่า - แม้ว่าฉันจะเรียนรู้เพิ่มเติมจากคำตอบของเขา / เธอ
Anthony G - ความยุติธรรมสำหรับโมนิก้า

ฉันคิดว่าคำสั่งแรกจะไม่ทำงานเพราะไม่ได้ตั้งค่าบิตแรกให้เป็นคู่!
amrx

สวัสดี @amrx คุณแน่ใจหรือไม่ว่าบิตแรกของ MAC จะต้องเป็นแบบเดียวกัน ฉันมี NIC หนึ่งในเซิร์ฟเวอร์ของฉันซึ่งเริ่มต้นด้วยecดังนั้น 11101100 ในไบนารี ...
ยาโรสลาฟ Kucera

1
สวัสดี @JaroslavKucera ที่อยู่ Unicast MAC จะต้องไม่วางบิตของตำแหน่ง 1 ในไบต์แรก นั่นคือบิต "กลุ่ม" (มัลติคาสต์ / ออกอากาศ) หากคุณสร้างที่อยู่ MAC ของคุณเองคุณควรตั้งค่าบิตสถานที่ 2 (บิต "การดูแลระบบแบบโลคอล" ในไบต์แรก) เพื่อแยกความแตกต่างจากที่อยู่ MAC ที่ไม่ซ้ำกันซึ่งรับประกันทั่วโลก
amrx

4

ฉันรู้ว่าโพสต์นี้เก่า แต่สำหรับผู้เยี่ยมชมในอนาคตหากคุณต้องการที่อยู่ 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'

2

นี่คืออีกหนึ่งตามคำตอบของ wombie:

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

ไม่จำเป็นต้องเรียกใช้เอาต์พุต urandom ผ่าน md5sum; คุณสามารถใช้ od ตามคำตอบของ Aaron Toponce
womble

2

นี่คือห้าตัวเลือกอื่น ๆ ทั้งหมดใช้บิตสุ่มสำหรับบิตที่มีนัยสำคัญน้อยที่สุดของไบต์ที่สำคัญที่สุดที่ระบุว่าที่อยู่เป็น 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 odX


1

คุณสามารถเพิ่ม $ RANDOM หลังจาก $ FQDN และนี่จะให้ที่อยู่ mac แบบสุ่มทุกครั้งที่คุณเรียกใช้ สิ่งนี้มีประโยชน์อย่างยิ่งสำหรับคน poeple ที่ต้องการสร้าง vms สำรองโดยใช้ snapshot หรือโคลนของ vms

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

1
โปรดทราบว่า $ RANDOM มีให้บริการใน bash แต่อาจไม่สามารถใช้ได้ใน shell อื่น ๆ
Michael Hampton



0

เพื่อความสนุกนี่คือเวอร์ชั่นทุบตีแท้ทดสอบกับ 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 :

หากอักขระนำหน้าเป็นเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่ค่าจะเป็นค่าตัวเลขในชุดโค้ดพื้นฐานของอักขระตามเครื่องหมายคำพูดเดี่ยวหรือเครื่องหมายคำพูดคู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.