在我的脚本中,我需要随机生成 MAC 地址。下面的代码是从一个更大的脚本中提取的,这就是为什么 MAC 地址计算是在一个单独的函数中的。
这与下面的代码配合得很好。尽管当我执行脚本时,在生成多个地址后它的速度会大大减慢。
我怎么能够提高速度生成有效的MAC地址?
#!/bin/bash
devicesCSVMacAddress="55:2d:fa:07" # <- fake MAC address prefix
devicesCSVFile=''
function mac_address() {
line=''
# ****************
# This line below when I calculate a random mac address ending seems to be slow
line+=$devicesCSVMacAddress$(od -txC -An -N2 /dev/random|tr \ :)
# ****************
devicesCSVFile+=$line'\n'
date
}
for (( i=0; i<100; i++ ))
do
mac_address
echo $i
done
echo -e $devicesCSVFile > devices.csv
我使用了 od 工具,就像这个答案中描述的那样:如何使用 bash shell 生成有效的随机 MAC 地址。
答案1
使用/dev/urandom
!几乎没有充分的理由使用/dev/random
-/dev/urandom
请参阅关于乌兰多姆的神话或者何时使用 /dev/random 与 /dev/urandom——当然不是当你要在各处发布生成的数字时。
/dev/random
如果没有足够的可用熵,则会消耗熵、阻塞并等待。/dev/urandom
永远不会阻塞。
答案2
这将避免重复,同时保持您想要的随机性
prefix='55:2a:fa:07'
while :
do
echo $prefix$(od -txC -An -N2 /dev/urandom | tr ' ' :)
done |
awk '!h[$0]++ {print $0; ONR++} ONR>100 {exit}' >devices.csv
该awk
构造会跟踪它已经见过的行,并仅输出那些以前没有见过的行。当它输出 100 行时,它退出并且循环停止。
答案3
和zsh
:
#! /bin/zsh -
prefix=55:2d:fa:07
(){
local LC_ALL=C
IFS= read -ru0 -k2 a < /dev/urandom
printf '%s:%02x:%02x\n' "$prefix" \'${^(s::)a}
}
只会使用内置函数。zsh
其中的具体功能有:
- 它可以处理变量中的 NUL 字节(与所有其他 shell 相反)
(){...}
:匿名函数(此处用于 LC_ALL 的本地作用域)。read -k2
:读取两个字符(这里是 LC_ALL=C 的字节)。ksh93
现在bash
已经-N
为此了。您需要-u0
(与ksh
)相同,-k
而不是指键盘按键。(s::)
要分割的参数扩展标志(此处为空字符串,因此分割为单个字符)。$^array
:分配该数组扩展,因此它变为'x 'y
。- 该
printf
命令在这里是标准的,包括'x
获取字符的代码点值的部分。