如何使用 bash 生成有效的随机 mac 地址。
地址的前半部分应始终保持不变
00-60-2F-xx-xx-xx
Run Code Online (Sandbox Code Playgroud)
只是应该随机生成 x 值吗?
del*_*ray 19
这里有一条鱼。
此 shell 脚本将生成您要查找的随机字符串:
#!/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
Run Code Online (Sandbox Code Playgroud)
我确实只是在这里展示了如何从命令行运行它,但是在查看了 Dennis Williamson 令人费解(但赞成)的解决方案后,我看到人们期望的答案是他们不必做任何工作的答案他们自己。
Sea*_*der 19
过去,我使用以下方法完成了此操作:
echo 00-60-2F-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]
Run Code Online (Sandbox Code Playgroud)
但这只会使它们在 0-9 范围内。就我的目的而言,这已经足够了。
可能更好的解决方案是使用 printf:
printf '00-60-2F-%02X-%02X-%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理:
Rob*_*ans 17
#!/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
Run Code Online (Sandbox Code Playgroud)
或者在python中:
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'))
Run Code Online (Sandbox Code Playgroud)
请注意,python 版本仅使用 16 宽字段来生成十六进制字符,因此您不必担心零填充 - 已修改方法以解决注释。
wnr*_*rph 14
使用标准工具,或者
# output in capitals
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
Run Code Online (Sandbox Code Playgroud)
或者
# output in lower case letters
echo 00-60-2f$(od -txC -An -N3 /dev/random|tr \ -)
Run Code Online (Sandbox Code Playgroud)
可能是最短的。
#!/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"
Run Code Online (Sandbox Code Playgroud)
其工作方式的关键:
LC_CTYPE=C - 允许字符 > 0x7F
IFS=- 禁用\t(制表符)、\n(换行符)和空格的解释
-d ''- 允许换行
-r允许\(并且应该几乎总是习惯使用read)
格式说明符-%02x\n使输出为文字连字符后跟两位十六进制数字,如果合适,则包括前导零。换行在这里是多余的,可以省略。
在read得到一个单一的字节(-n 1从)/dev/urandom中的范围为0〜255(00至FF)。
printfin 循环的最后一个参数中的单引号导致字符作为其数值输出(“A”输出为“65”)。请参阅POSIX 规范以了解printf其内容:
如果前导字符是单引号或双引号,则该值应是单引号或双引号之后字符的底层代码集中的数值。
小智 7
我能想到的最短方法是直接使用 hexdump
echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
Run Code Online (Sandbox Code Playgroud)
在 GNU/Linux 上测试