Cách tạo địa chỉ MAC ngẫu nhiên từ dòng lệnh Linux


26

Làm cách nào để tạo địa chỉ MAC ngẫu nhiên từ dòng lệnh Linux?

Tôi tìm kiếm một giải pháp chỉ yêu cầu các công cụ tiêu chuẩn thường thấy trên dòng lệnh Linux.

Địa chỉ MAC sẽ được sử dụng cho KVM khách.

Câu trả lời:


46

tôi sử dụng

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

Lợi ích của phương pháp này, qua một số hoàn toàn ngẫu nhiên, là có thể tái tạo một cách đáng tin cậy địa chỉ MAC dựa trên FQDN của máy, đôi khi tôi thấy hữu ích. Các 02cho octet đầu tiên chỉ đặt ra "gán cục bộ" chút, mà làm cho nó rõ ràng rằng nó không phải là một địa chỉ MAC nhà cung cấp cung cấp, và đảm bảo rằng bạn sẽ không va chạm với địa chỉ MAC một thực NIC.

Nếu bạn cần tạo nhiều địa chỉ MAC trên mỗi máy chủ, tôi đã sử dụng nối FQDN với tên của cây cầu để kết nối giao diện với; điều này đã làm rất tốt trong việc phổ biến mọi thứ cho các NIC khác nhau.


+1 cho độ tái lập; đối với các ứng dụng nhất định, điều đó làm cho nó trở thành một phương pháp ưu việt hơn nhiều.
MadHatter hỗ trợ Monica

Cảm ơn rất nhiều, tôi thích ý tưởng có thể tái tạo nó.
Erik Sjölund

Ngoài ra, không có xung đột địa chỉ mac trong trường hợp không mong muốn, bạn sẽ tạo ngẫu nhiên cùng một mac hai lần
Petter H

3
Thay thế bạn có thể sử dụngtr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
ALex_hha

1
Nó chỉ là một "sự thay thế" theo nghĩa là nó tạo ra một kết quả cuối cùng hoàn toàn khác với những gì đoạn trích của tôi làm ...
womble

8

Các kịch bản được đăng là tốt, nhưng tôi muốn thêm một cảnh báo: Hãy nhớ ngày sinh nhật (nghịch lý)!

Nó xuất phát từ thực tế là ngay cả khi bạn chỉ có 23 người, cơ hội đã có 50% rằng 2 người trong số họ có sinh nhật trong cùng một ngày.

Nó phụ thuộc vào kịch bản của bạn về cách bạn sử dụng nó, nhưng nếu bạn tạo MACS một cách ngẫu nhiên, với khoảng 1 triệu cơ hội cho một cuộc đụng độ số mac là 40% ở mức 2 triệu thì đã là 87%!

Nếu bạn chỉ cần một vài cái thì không sao, nhưng khi bạn duy trì một cụm máy chủ với hàng trăm máy chủ, thì mỗi máy chủ đều lưu trữ hàng chục máy ảo hoặc nếu bạn sử dụng máy Mac làm chỉ mục trong một số db để ghi sổ và bạn cần cẩn thận !


Cảm ơn, vì lời cảnh báo về nghịch lý sinh nhật! Trong trường hợp của tôi, tôi sẽ chấp nhận rủi ro vì tôi sẽ tạo ra khoảng 20 địa chỉ MAC.
Erik Sjölund

3
Nếu bạn đang chạy hàng trăm máy chủ, mỗi máy chủ lưu trữ hàng chục máy ảo trên cùng một miền quảng bá, bạn đã gặp vấn đề lớn hơn rủi ro va chạm địa chỉ MAC.
womble

1
" Xuất phát từ thực tế là ngay cả khi bạn chỉ có 23 người, cơ hội đã có 50% rằng 2 người trong số họ có sinh nhật trong cùng một ngày. " Điều đó thậm chí không đúng. Có khoảng 50% cơ hội hai trong số 23 người có cùng ngày kỷ niệm sinh nhật, không cùng ngày sinh nhật.
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, cưa máy của quân đội Thụy Sĩ một lần nữa. Và bằng cách của phiên bản 0.2, tôi vô tình đánh cắp điểm tuyệt vời của womble về octet đầu tiên là 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

Cảm ơn MadHatter, tôi đã thử biến thể thứ hai của bạn và nó đã hoạt động. Rất đẹp!
Erik Sjölund

5

Những biến thể này hoạt động là tốt.

lâu hơn:

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

hoặc ngắn hơn:

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

Tiêu thụ tải của cả hai biến thể rất giống nhau theo cách đo nhanh theo thời gian.


Xin chào Anthony, tôi thấy không có biến thể nào khác kết hợp openssl rand và sed ở đây, vì vậy đây là giải pháp độc đáo trong chủ đề này.
Jaroslav Kucera

Đung. Anh ấy / cô ấy đã sử dụng fold -w2|paste -sd: -thay vì sed. Các sedgiải pháp có lẽ là dễ nhớ hơn vì nó sử dụng một công cụ quen thuộc hơn - mặc dù tôi học được nhiều hơn từ câu trả lời của anh ấy / cô ấy.
Anthony G - công lý cho Monica

Tôi nghĩ rằng lệnh đầu tiên sẽ không hoạt động vì nó không đặt bit đầu tiên thành chẵn!
amrx

Xin chào @amrx, bạn có chắc rằng bit đầu tiên của MAC phải là số chẵn? Tôi có NIC ở một trong các máy chủ của mình, bắt đầu bằng ec11101100 ở dạng nhị phân ...
Jaroslav Kucera

1
Xin chào @JaroslavKucera, địa chỉ MAC Unicast không bao giờ được đặt bit vị trí 1 trong byte đầu tiên. Đó là bit "nhóm" (phát đa hướng / phát sóng). Nếu bạn tạo địa chỉ MAC của riêng mình, bạn phải đặt bit vị trí của 2 (bit "được quản lý cục bộ") trong byte đầu tiên, để phân biệt với địa chỉ MAC duy nhất được bảo đảm trên toàn cầu.
amrx

4

Tôi biết bài đăng này đã cũ, nhưng đối với khách truy cập trong tương lai, nếu bạn muốn một địa chỉ MAC giả mã hóa an toàn về mặt mật mã, mà không bị giới hạn ở 0x02 như OUI, thì đây là một trình tạo bất khả tri chủ yếu nền tảng nhanh:

$ 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

Đây là một câu hỏi khác, dựa trên câu trả lời của wombie:

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

Không cần phải chạy đầu ra urandom thông qua md5sum; bạn chỉ có thể sử dụng od theo câu trả lời của Aaron Toponce.
womble

2

Dưới đây là năm tùy chọn khác, tất cả đều sử dụng các bit ngẫu nhiên cho bit có trọng số thấp nhất của byte quan trọng nhất cho biết địa chỉ đó là unicast hay multicast và đối với bit có ý nghĩa thứ hai của byte quan trọng nhất cho biết địa chỉ đó là quản lý phổ biến hoặc địa phương.

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đi kèm với OS X và BSD nhưng không phải với hầu hết các bản phân phối Linux. Trong jot -wthay đổi định dạng, -sthay đổi dấu phân cách và -rtạo số ngẫu nhiên.

odlà trong POSIX nhưng hexdumpkhông phải.

OS X's od( /usr/bin/odbên dưới) sử dụng định dạng đầu ra khác với 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

Trong odcác tùy chọn của OS X được đặt sau một đối số cho tệp đầu vào được coi là tên của các tệp đầu vào, do đó, lệnh trong câu trả lời của Aaron Toponce đọc từ /dev/urandomvô thời hạn với OS X's od.


1

Bạn chỉ có thể thêm $ RANDOM sau $ FQDN và điều này sẽ cung cấp cho bạn các địa chỉ mac ngẫu nhiên mỗi khi bạn chạy nó. Điều này đặc biệt hữu ích cho những người muốn tạo vms sao lưu bằng cách sử dụng ảnh chụp nhanh hoặc bản sao của vms.

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

1
Lưu ý rằng $ RANDOM có sẵn trong bash, nhưng có thể không có sẵn trong các shell khác.
Michael Hampton


0

Python one-liner:

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

0

Để cho vui, đây là phiên bản bash thuần túy, được thử nghiệm dựa trên Bash 4.4.12 (1) -release:

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}"

Dòng đầu tiên đọc 6 ký tự từ /dev/urandom; sau đó sử dụng bộ ký tự C in giá trị hex chứa đầy 0 của mỗi ký tự được phân tách bằng dấu hai chấm (dòng mới là tùy chọn nhưng hữu ích để in ra giá trị).

Trích xuất giá trị của một ký tự bằng printf được xác định trong tài liệu printf POSIX :

Nếu ký tự đầu là một trích dẫn đơn hoặc trích dẫn kép, giá trị sẽ là giá trị số trong bộ mã cơ bản của ký tự theo sau trích dẫn đơn hoặc trích dẫn kép.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.