我有以下问题。我保留了一个固定的 MAC 前缀:
prefix=00:0c:29:51:
然后,我将添加两个八位字节。就像 4a:20 一样,我需要随机生成它。所以我有:
mac=$(awk -v min=1000 -v max=10000 'BEGIN{srand(); print int(min+rand()*(max-min+1))}' | sed -e 's/.\{2\}/&:/g;s/.$//')
最后,
final_mac=00:0c:29:51:$mac
echo $final_mac
然而,这有时会生成重复的 MAC。
80:29
67:51
99:48
87:36
87:36
缓解这种情况的一种方法是循环遍历此文本文件以检查当前生成的 MAC 是否存在。如果是,请重新生成并检查。
我有什么想法可以克服这个解决方法吗?谢谢。
答案1
为什么min=1000
和max=10000
?有 65536 个可能的两个八位字节值,是否有某种原因只使用其中的一部分?
在具有$RANDOM
(至少 Bash/ksh93/zsh)的 shell 中,您可以在 shell 中完全执行此操作:
printf "00:0c:29:51:%02x:%02x\n" $(( $RANDOM % 256 )) $(( $RANDOM % 256 ))
或者,如果您想将生成的地址存储在文件中,然后重试直到获得新的地址,如下所示:
file=./generated_macs
gen() {
printf "00:0c:29:51:%02x:%02x\n" $(( $RANDOM % 256 )) $(( $RANDOM % 256));
}
while mac=$(gen); grep -q "$mac" "$file" ; do true ; done
echo "$mac" >> "$file"
答案2
您可以使用 /dev/urandom 来生成它:
end=$( for i in $(seq 1 2); do character=$( tr -dc "0-9A-E" < /dev/urandom | head -c 2); printf ":%s" $character; done); echo "00:0c:29:51"$end