从/dev/urandom中获取特定数量的字符?

Get a specific number of char from /dev/urandom?

我正试图克服 OS X 上“缺乏”一个好的终端工具来生成密码的问题。 这个脚本是来自各种来源的混合,并且已经从我这边完成调试 (here, here, here and here too)

pass=`LC_CTYPE=C < /dev/urandom tr -cd [:graph:] | tr -d '\n' | head -c 32`
echo $pass

我选择了 head -c 32 方法而不是 fold -w 32 方法,因为在阅读了相应的手册页后 head 对我来说似乎更清楚了,而且因为当我使用 fold 时,脚本只是“挂起” "(永远不要停止加载)。 我确实清楚地知道 head 的 -c 标志是针对多个字节而不是字符,这就是为什么有时我的结果密码中有超过 32 个字符的原因。

问题是,有没有办法将 head 替换为 32 个字符? (我会接受使用 fold,当然,如果你向我解释为什么它不起作用并改写 fold -w 的用法,这样我就可以比男人的描述更清楚地理解它)。

有问题的例子 return :

^[[A]S9,Bx8>c:fG)xB??<msm^Ot|?C()bd] # 36 characters, sadly 

一个选择就是同时使用 foldhead:

pass=$(LC_CTYPE=C < /dev/urandom tr -cd [:graph:] | tr -d '\n' | fold -w 32 | head -n 1)

fold 保持行长 32 个字符,而 head 在捕获第一行后退出。作为奖励,我已将您的反引号更新为更现代的 $( ) 语法。

fold -w 32 将在每输入 32 个字符后在输出中插入换行符。只要继续有任何输入,它就会继续产生输出。 head -n 1 将在一行后退出(使用换行符,关闭管道并导致所有命令终止。

也许使用 dd:

echo "$(LC_CTYPE=C < /dev/urandom tr -cd [:graph:] | tr -d '\n' | dd count=1 bs=32 status=none )"

在Linux上,tr -d '\n'好像没用,那个人说

[:graph:] all printable characters, not including space

但我不知道 OSX 的 tr 是否具有相同的行为