function rand-str {
# Return random alpha-numeric string of given LENGTH
#
# Usage: VALUE=$(rand-str $LENGTH)
# or: VALUE=$(rand-str)
local DEFAULT_LENGTH=64
local LENGTH=${1:-$DEFAULT_LENGTH}
LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c $LENGTH
# LC_ALL=C: required for Mac OS X - https://unix.stackexchange.com/a/363194/403075
# -dc: delete complementary set == delete all except given set
}
openssl rand -base64 12 # only returns
rand=$(openssl rand -base64 12) # only saves to var
sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 17) # leave only letters and numbers
# The last command can go to a var too.
演示:x=100; while [ $x -gt 0 ]; do sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 17); x=$(($x-1)); done 示例:
# !/bin/bash
array=()
for i in {a..z} {A..Z} {0..9}; do
array[$RANDOM]=$i
done
printf %s ${array[@]::8} $'\n'
(Or大量随机字符串)
# !/bin/bash
b=()
while ((${#b[@]} <= 32768)); do
a=(); for i in {a..z} {A..Z} {0..9}; do a[$RANDOM]=$i; done; b+=(${a[@]})
done
tr -d ' ' <<< ${b[@]} | fold -w 8 | head -n 4096
9条答案
按热度按时间vh0rcniy1#
使用参数扩展。
${#chars}
是可能的字符数,%
是模运算符。${chars:offset:length}
选择offset
位置的字符,即在本例中为0长度($chars)。ivqmmu1c2#
对于那些在bash中寻找随机字母数字字符串的用户:
LC_ALL=C tr -dc A-Za-z0-9 </dev/urandom | head -c 64
与文档化功能相同:
yshpjwxd3#
另一种生成32字节(例如)十六进制字符串的方法:
如果要使用大写字符,请添加
-u
。ngynwnxp4#
OPTION 1-无特定长度,不需要openssl,只有字母和数字,比 option 2 慢
演示:
x=100; while [ $x -gt 0 ]; do sed "s/[^a-zA-Z0-9]//g" <<< $(cat /dev/urandom | tr -dc 'a-zA-Z0-9!@#$%*()-+' | fold -w 32 | head -n 1) <<< $(openssl rand -base64 17); x=$(($x-1)); done
示例:
OPTION 2-无特定长度,openssl*需要 *,仅字母和数字,比 option 1 快
演示:
x=100; while [ $x -gt 0 ]; do sed "s/[^a-zA-Z0-9]//g" <<< $(openssl rand -base64 17); x=$(($x-1)); done
示例:
不一定相关的其他选项:
uuidgen
或cat /proc/sys/kernel/random/uuid
在未来100年内每秒产生10亿个UUID后,仅产生一个副本的概率约为50%。如果地球上每个人都拥有6亿个UUID source,则产生一个副本的概率约为50😇
6mzjoqzu5#
没有使用
$RANDOM
,但值得一提。使用shuf作为熵的来源(也称为随机性)(反过来,它可以使用
/dev/random
作为熵的来源,如'shuf -i1-10 --random-source=/dev/urandom)似乎是一个使用更少资源的解决方案:oymdgrw76#
如果您打开了安全选项,则可以在bash脚本中安全地使用此选项:
这是使用管道时bash退出状态141的解决方法
hgb9j2n67#
使用 sparse 数组来重排字符。
(Or大量随机字符串)
q9yhzks08#
有点晦涩,但简短的解决方案是
希望您具有对当前目录的写访问权限;- )
mktemp
是核心实用程序的一部分UPDATE:正如Bazi在注解中指出的,可以在不创建文件的情况下使用mktemp;- ),因此命令可以更短。
8oomwypt9#
基于Radu Gabriel's answer并使用GNU bash版本4.4.20和
set -euxo pipefail
进行测试的简化安全管道解决方法: