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.
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:
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 02
cho 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.
tr -dc A-F0-9 < /dev/urandom | head -c 10 | sed -r 's/(..)/\1:/g;s/:$//;s/^/02:/'
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 !
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
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.
fold -w2|paste -sd: -
thay vì sed
. Các sed
giả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.
ec
11101100 ở dạng nhị phân ...
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'
Đâ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
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
-w
thay đổi định dạng, -s
thay đổi dấu phân cách và -r
tạo số ngẫu nhiên.
od
là trong POSIX nhưng hexdump
không phải.
OS X's od
( /usr/bin/od
bê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 od
cá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/urandom
vô thời hạn với OS X's od
.
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/')
Tôi sử dụng:
echo -n 02; od -t x1 -An -N 5 /dev/urandom | tr ' ' ':'
Để 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.