Câu trả lời:
Đây là một con cá.
Kịch bản shell này sẽ tạo ra chuỗi ngẫu nhiên bạn tìm kiếm:
#!/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
Tôi đã có một cái gì đó ở đây chỉ ra cách chạy nó từ dòng lệnh, nhưng sau khi xem giải pháp Dennis Williamson bị xáo trộn (nhưng được nâng cấp), tôi thấy rằng câu trả lời mà mọi người mong đợi là câu trả lời mà họ không phải làm chúng tôi.
#!/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
Hoặc trong trăn:
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'))
Lưu ý rằng phiên bản python chỉ sử dụng trường rộng 16 để tạo char hex, vì vậy bạn không phải lo lắng về phần đệm bằng không - cách tiếp cận được sửa đổi để giải quyết một nhận xét.
00-60-2F-8B-5-2C
, 00-60-2F-A-71-97
, 00-60-2F-82-F1-4
.
Trước đây tôi đã làm điều này bằng cách sử dụng:
echo 00-60-2F-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]
nhưng điều đó sẽ chỉ làm cho chúng trong phạm vi 0-9. Đối với mục đích của tôi, điều đó là đủ tốt.
Có lẽ một giải pháp tốt hơn sẽ là sử dụng printf:
printf '00-60-2F-%02X-%02X-%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]
Đây là cách nó hoạt động:
Sử dụng các công cụ tiêu chuẩn, hoặc
# output in capitals
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
hoặc là
# output in lower case letters
echo 00-60-2f$(od -txC -An -N3 /dev/random|tr \ -)
có thể là ngắn nhất trong tất cả.
#!/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"
Các chìa khóa để làm việc này:
LC_CTYPE=C
- cho phép các ký tự> 0x7FIFS=
- vô hiệu hóa giải thích \t
(tab), \n
(dòng mới) và dấu cách-d ''
- cho phép dòng mới-r
cho phép \
(và hầu như luôn luôn được sử dụng theo thói quen vớiread
)-%02x\n
làm cho đầu ra là một dấu gạch ngang theo sau bằng số thập lục phân hai chữ số bao gồm số 0 đứng đầu, nếu phù hợp. Dòng mới là không cần thiết ở đây và có thể được bỏ qua.read
được một byte ( -n 1
) từ /dev/urandom
trong phạm vi 0 đến 255 ( 00
đến FF
).Dấu ngoặc đơn trong đối số cuối cùng printf
trong vòng lặp làm cho ký tự được xuất thành giá trị số của nó ("A" là đầu ra là "65"). Xem thông số kỹ thuật POSIX để biếtprintf
nơi nó nói:
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.
IFS= read …
tránh gấp 09 0a và 20 (ký tự IFS thông thường) thành 00.
-d ''
. Tôi sẽ sửa câu trả lời của tôi. Cảm ơn vì đã cho tôi biết.
-r
bảo vệ `\` rơi ra. Tôi muốn xử lý thích hợp dữ liệu nhị phân trong các chương trình shell không quá khó. Dường như không thể biểu diễn chính xác 00 ở giữa chuỗi. Phương thức một ký tự một lần của bạn xử lý 00 nhờ sự hợp tác thuận tiện (được thiết kế?) Giữa read
, nội suy chuỗi và cách printf
xử lý đối số một ký tự '
. Thở dài.
hexdump -C
.
Cách ngắn nhất tôi có thể nghĩ ra là sử dụng hexdump trực tiếp
echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
Đã thử nghiệm trên GNU / Linux
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
ngắn hơn một chút :-)
Một giải pháp một dòng khác
$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g'
Điều tương tự trong chữ hoa
$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g' | tr '[:lower:]' '[:upper:]'
Tạo nó cho biến môi trường Bash
$ export MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g')
$ echo $MAC
Chi tiết:
od (bãi bát phân)
-An
Loại bỏ đại diện địa chỉ hàng đầu (thêm nhiễu) của đầu ra.
-N3
Giới hạn đầu ra đến ba byte.
-t xC
Đầu ra ở dạng hex, ký tự ASCII, như mong muốn.
/dev/urandom
Linux kernel số giả ngẫu nhiên tập tin.
sed (trình chỉnh sửa luồng) Dành cho không gian để thay thế dấu gạch nối.
-e <SCRIPT>
thực hiện kịch bản sed.
tr (dịch chuỗi) Tùy chọn, trong ví dụ này. Tôi thích địa chỉ MAC chữ hoa trong tập lệnh / môi trường của tôi.
#!/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
Điều này sẽ làm việc
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
Điều này làm việc là tốt. Đầu ra là tất cả trong trường hợp trên theo yêu cầu.
openssl rand -hex 3 | sed 's/\(..\)\(..\)\(..\)/00-60-2F-\1-\2-\3/' | tr [a-f] [A-F]
Đây là tác phẩm trong #!/bin/sh
tập lệnh shell ( ) cổ điển :
random_mac() {
printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -6
}
Hoặc, nếu bạn muốn có tiền tố tùy chỉnh:
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
}
Ví dụ sử dụng:
$ 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
Một lựa chọn khác là sử dụng jot
:
echo 00-60-2F-$(jot -w%02X -s- -r 3 0 256)
-w
thay đổi định dạng, -s
thay đổi dấu phân cách và -r
tạo số ngẫu nhiên.
Các lệnh sử dụng od
trong các câu trả lời được đăng bởi artistoex và zero2cx sẽ thêm dấu gạch ngang vào đầu ra với OS X od
, nhưng điều này không:
echo 00-60-2f-$(od -tx1 -An -N3 /dev/random|awk '$1=$1'|tr \ -)
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 -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
.
Trong Linux:
printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
Giải trình:
Trong Linux /proc/sys/kernel/random/uuid
trả về UUID loại 4 (ngẫu nhiên) mới mỗi khi bạn đọc nó. Hầu hết các ký tự của nó là các chữ số thập lục phân ngẫu nhiên (giả), do đó chúng ta có thể sử dụng chúng. Ví dụ:
$ 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
Bây giờ đã đủ để in 00-60-2f-
(không có dòng mới) trước:
$ printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
00-60-2f-86-f9-21
Ưu điểm:
printf
và cut
là các công cụ POSIX;Nhược điểm:
/proc/sys/kernel/random/uuid
có thể không có sẵn trên một số hệ thống;
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'