シェルから6桁のOTP番号を印刷する方法

シェルから6桁のOTP番号を印刷する方法

6桁のランダムOTP番号を生成するスクリプトを作成しました。より少ないコード行で6桁のOTP番号を簡単に取得する方法はありますか?

私のコード:

#!/bin/bash

dynamic_array=()

for (( i =1 ; i<=5 ; i++))
{
    store_digit=$(shuf -i0-9 -n1) ; dynamic_array+=("$store_digit")
}
str_array_value="${dynamic_array[*]}" ; echo "Output : ${str_array_value// /}" 

答え1

作成したい場合実際確認できない任意の6桁の文字列ではなく、共有秘密で生成されたOTPトークンを使用できます。oathtool

それ以外の場合は、スチールドライバーのコメントで十分ですprintf '%06d\n' "$(shuf -i0-999999 -n1)"

答え2

6桁の10進数には、15桁を超える任意の数字が必要です。ここでは30桁の任意の数字を使用します。

((RND=RANDOM<<15|RANDOM)) ; echo ${RND: -6}

編集:視点のいくつかのテストです。

~# time for i in {0..2000} ;do printf '%06d\n' "$(shuf -i0-999999 -n1)" >/dev/null ;done

real    0m13.814s
user    0m9.573s
sys     0m4.302s

~# time for i in {0..2000} ;do ((RND=RANDOM<<15|RANDOM)) ; echo ${RND: -6} >/dev/null ;done

real    0m0.120s
user    0m0.101s
sys     0m0.019s

答え3

問題は次のように再構成できます。 "UTF-8 サブセット: {0,1,2,3,5,6,7,8,9} の文字を含むランダムな 6 文字の文字列を出力します。"

その結果は次のとおりです。

cat /dev/urandom | tr -dc 0-9 | head -c 6

関連情報