我编写了一个生成 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