回答:
ここに魚がいます。
このシェルスクリプトは、求めるランダムな文字列を生成します。
#!/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
コマンドラインからそれを実行する方法を示したものがここにありましたが、デニス・ウィリアムソンの複雑な(しかし賛成した)ソリューションを見た後、人々が期待する答えは仕事をする必要がないものであることがわかります自分自身。
#!/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
または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'))
Pythonバージョンでは16進数のフィールドを使用して16進文字を生成するだけなので、ゼロパディングについて心配する必要はありません。コメントに対処するために修正されたアプローチです。
00-60-2F-8B-5-2C
、00-60-2F-A-71-97
、00-60-2F-82-F1-4
。
過去に私はこれを使ってこれをやってきました:
echo 00-60-2F-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]-$[RANDOM%10]$[RANDOM%10]
しかし、それはそれらを0-9の範囲でのみ作成します。私の目的では、それで十分でした。
おそらくより良い解決策は、printfを使用することです。
printf '00-60-2F-%02X-%02X-%02X\n' $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]
仕組みは次のとおりです。
#!/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"
これが機能する方法の鍵:
LC_CTYPE=C
-0x7Fを超える文字を許可IFS=
- \t
(タブ)、\n
(改行)、およびスペースの解釈を無効にします-d ''
-改行を許可します-r
許可します\
(ほぼ常に習慣で使用する必要がありますread
)-%02x\n
により、出力はリテラルハイフンの後に、必要に応じて先行ゼロを含む2桁の16進数が続きます。改行はここでは不要であり、省略できます。read
1バイトを(取得します-n 1
から)/dev/urandom
(255の範囲で0に00
しますFF
)。最後の引数の単一引用符 printf
ループと、文字が数値として出力されます(「A」は「65」として出力されます)。POSIXの仕様をprintf
参照してください:
先行文字が単一引用符または二重引用符である場合、値は、単一引用符または二重引用符に続く文字の基になるコードセットの数値でなければなりません。
IFS= read …
00に09 0Aと20(通常IFSの文字を)折りたたみ避けるために
-d ''
。答えを修正します。知らせてくれてありがとうございます。
-r
`\`を保護するものが落ちました。シェルプログラムでのバイナリデータの適切な処理がそれほど面倒ではなかったことを願っています。string文字列の途中で00を正確に表すことは不可能のようです。1文字ずつのメソッドは、、read
文字列の補間、およびprintf
1文字の引数の処理方法の間の便利な(設計された)協力により00を処理します'
。はぁ。
hexdump -C
。
私が思いついた最短の方法は、hexdumpを直接使用することでした
echo 00-60-2f$(hexdump -n3 -e '/1 "-%02X"' /dev/random)
GNU / Linuxでテスト済み
hexdump -n3 -e'/3 "00-60-2F" 3/1 "-%02X"' /dev/random
少し短くなります:
別の1行ソリューション
$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g'
大文字でも同じ
$ echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g' | tr '[:lower:]' '[:upper:]'
Bash環境変数用に生成する
$ export MAC=$(echo '00 60 2f'$(od -An -N3 -t xC /dev/urandom) | sed -e 's/ /-/g')
$ echo $MAC
詳細:
od(8進ダンプ)
-An
出力の先頭のアドレス表現(余分なノイズ)を抑制します。
-N3
出力を3バイトに制限します。
-t xC
必要に応じて、ASCII文字スタイルの16進数で出力します。
/dev/urandom
Linuxカーネルの乱数擬似ファイル。
sed(ストリームエディター)スペースからハイフンへの置換用。
-e <SCRIPT>
sedスクリプトを実行します。
この例では、tr(文字列変換)オプション。スクリプト/環境で大文字のMACアドレスが好きです。
#!/bin/bash
#Creates an array containing all hexadecimal characters
HEX=(a b c d e f 0 1 2 3 4 5 6 7 8 9)
#Defines MAC string length as 0 (total SL will be 17)
SL=0
#Loop sequentially assigns random hex characters in pairs until a full
#MAC address is generated.
while [ $SL -lt 17 ]
do
num=`shuf -i 0-15 -n 1` #Generates random number which will be used as array index
RMAC="$RMAC""${HEX[$num]}" #Uses the randomly generated number to select a hex character
num=`shuf -i 0-15 -n 1` #New random number
RMAC="$RMAC""${HEX[$num]}" #Appends second hex character
SL=$[`echo $RMAC | wc -c` - 1] #Calculates SL and stores in var SL
if [ $SL -lt 17 ] #If string is uncomplete, appends : character
then
RMAC=""$RMAC":"
fi
done
echo $RMAC #Displays randomly generated MAC address
これは動作するはずです
echo 00-60-2f-`openssl rand -hex 3 | sed 's/\(..\)/\1-/g; s/.$//'`
これは、クラシックシェル(#!/bin/sh
)スクリプトで機能します。
random_mac() {
printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -6
}
または、カスタムプレフィックスを使用する場合:
random_mac_with_prefix() {
echo -n "00:60:2f:" &&
printf '%.2x\n' "$(shuf -i 0-281474976710655 -n 1)" | sed -r 's/(..)/\1:/g' | cut -d: -f -3
}
使用例:
$ random_mac
96:ef:45:28:45:25
$ random_mac
7e:47:26:ae:ab:d4
$ random_mac_with_prefix
00:60:2f:24:f4:18
$ random_mac_with_prefix
00:60:2f:63:08:b2
別のオプションは使用することjot
です:
echo 00-60-2F-$(jot -w%02X -s- -r 3 0 256)
-w
フォーマットを-s
変更し、セパレータを変更し、そして-r
乱数生成します。
od
artistoexとzero2cxによって投稿された回答で使用するコマンドは、OS Xの出力にダッシュを追加しますod
が、これはしません:
echo 00-60-2f-$(od -tx1 -An -N3 /dev/random|awk '$1=$1'|tr \ -)
OS X od
(/usr/bin/od
以下)はGNUとは異なる出力形式を使用しますod
:
$ /usr/bin/od -N3 -tx1 -An /dev/random|tr ' ' -
-----------c7--fd--55----------------------------------------------------
$ god -N3 -tx1 -An /dev/random|tr ' ' -
-94-9e-5c
jot -w%02X -s- -r 3 1 256
しましたjot -w%02X -s- -r 3 0 256
。
Linuxの場合:
printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
説明:
Linuxでは/proc/sys/kernel/random/uuid
、読み取るたびに新しいタイプ4(ランダム)UUIDを返します。ほとんどの文字は(疑似)ランダムな16進数であるため、使用できます。例えば:
$ cat /proc/sys/kernel/random/uuid
5501ab12-b530-4db5-a8ea-3df93043f172
$ # ^ ^ Beware, these characters are not random.
$ # ^^^^^ ^^^ Let's use characters on these positions.
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
6d-74-a1
$ cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
13-f9-75
これで、00-60-2f-
最初に(改行なしで)印刷するだけで十分です。
$ printf '00-60-2f-' && cut -b 7-11,24-26 /proc/sys/kernel/random/uuid
00-60-2f-86-f9-21
長所:
printf
およびcut
POSIXツールです。短所:
/proc/sys/kernel/random/uuid
一部のシステムでは利用できない場合があります。
echo -n 00-60-2F; dd bs=1 count=3 if=/dev/random 2>/dev/null |hexdump -v -e '/1 "-%02X"'