
私のスクリプトでは、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シェルを使用して有効なランダム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バイトを処理できます。
(){...}
:匿名関数(ここではLC_ALLのローカルスコープで使用されます)read -k2
:2文字を読みます(ここにはLC_ALL = Cのバイトがあります)。既にこれのためにksh93
今。キーボードキーを参照しないで、同じでなければなりません。bash
-N
-u0
ksh
-k
(s::)
分割するパラメータ拡張フラグ(ここでは空の文字列なので単一文字に分割されています)$^array
:この配列を割り当てて拡張するとなります'x 'y
。- ここでは、文字のコードポイント値を取得する部分を含むコマンドが
printf
標準です。'x