如何在 shell 中打印 6 位 OTP 号码

如何在 shell 中打印 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

如果你想生成实际的从共享秘密生成的 OTP 令牌,而不仅仅是您无法验证的随机六位数字字符串,您可以使用oathtool

否则,steeldriver 的评论应该足够了:printf '%06d\n' "$(shuf -i0-999999 -n1)"

答案2

对于 6 位十进制数字,我们需要一个大于 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

该问题可以重新定义为:“输出一个随机的 6 个字符的字符串,其中包含来自 UTF-8 子集的字符:{0,1,2,3,5,6,7,8,9}”。

这导致:

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

相关内容