'/dev/random'
我知道我可以从(或)获取不受约束的随机(伪随机)字符/dev/urandom
。但如果我需要这些字符来生成文件名怎么办?我需要以某种方式获得可打印字符流或序列,或者为了安全起见,使用字母数字字符。在 shell 中执行此操作的最佳方法是什么?
(我知道理论上我可以tr
对字符进行操作/dev/random
但这听起来不是正确的做法。)
答案1
我所看到的/usr/bin/jot
能够提供指定数量的受限随机字符,这些字符可以重新整形为适合文件名的单词。可能有一种更简洁的方式来指定所有可打印字符,但我对 shell 脚本有点生疏。
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
EUCGGSIOIDMPCHXCHIGYXBYWJ
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
PMKQQZOCYETVIHIMTIQFYTFZK
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
CXBKEFSIRCOOGUICJPOMZKMSG
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
MEHSFOSHLKKJRKQLRCXUCBJAD
[mini-nevie:~] nevinwilliams% jot -r -c 25 A Z | rs -g
ZCCGKYIWLBTJUVIHQBCHXCVEU
答案2
$ dd if=/dev/urandom of=/dev/stdout bs=124 count=1 2>/dev/null | sha256sum | awk '{print $1}'
答案3
对@dawud 的修改解决方案:
dd if=/dev/urandom bs=124 count=1 2>/dev/null | sha256sum | cut -c1-64
为您提供 64 个字符;并且您可以/dev/random
在没有 的 UN*X 系统上使用/dev/urandom
。
根据@NevinWilliam 的建议,一种不同的、更简单的方法:只需这样做
date +%s.%N
没有字母字符是字母数字的特殊情况......这并不涵盖可能的字符串的整个范围,并且限制为 9 个字符,并且它不是很随机 - 除了可能最后 2-4 位数字左右 - 但由于我们不进行加密,这应该足够好了。
答案4
在 urandom 字符串上使用 base64 将解决所有编码问题。您应该尝试:
$ dd if=/dev/urandom bs=32 count=1 2>/dev/null |base64
A5o88RTh2LZlsr9F2r3jRPSqBZMMaa1EIAyndnVYhAQ=
更改 bs 参数以获取预期长度。您还可以删除最后一个字符,因为它是 base64 尾随字符。