如何提高od生成MAC地址的性能?

如何提高od生成MAC地址的性能?

在我的脚本中,我需要随机生成 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获取字符的代码点值的部分。

相关内容