【发布时间】:2022-05-12 19:45:12
【问题描述】:
我正试图克服 OS X 上“缺乏”一个好的终端工具来生成密码的问题。 这个脚本是来自各种来源的混合体,并且已经在我这边进行了调试(here、here、here 和 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 的用法,这样我就可以比来自该人的描述更清楚地理解它。
有问题的退货示例:
^[[A]S9,Bx8>c:fG)xB??<msm^Ot|?C()bd] # 36 characters, sadly
【问题讨论】:
-
我不使用 OSX,但我怀疑
pass实际上总是 32 个字符长,但echo $pass有时会做一些有趣的事情,具体取决于内容.echo "$pass"稍微好一点,但echo确实不适合打印任意字符串。尝试将管道的输出通过管道传输到 hexdump 或wc以进行检查。而不是使用echo $pass尝试printf "%s\n" "$pass"。顺便说一句,您不需要管道中的第二个tr,因为第一个应该删除\n字符。 -
感谢您的评论,我实际上做了一个没有 tr 换行符的版本,并在我的回声通行证中得到了新行(也许它来自回声本身,正如你所说)。而且由于 tr 的人只代表
[:graph:] all printable characters, not including space我不确定换行符是否在这个类中,所以不会或不会(按这个顺序)被 tr -cd 抑制:) -
您可以使用
printf对其进行测试。例如,这是一个带有换行符和制表符的字符串。printf "this\nis\ta\ntest\n" | tr -cd '[:graph:]' -
这是因为
echo将\n解释为两个单独的字符。在 Linux 上,我们有一个-e选项到echo来强制它解释反斜杠字符,但你在 OSXecho上没有这个功能。 -
bash内置echo无论您在 Linux 还是 OS X 上使用它都一样,并且需要-e标志将\n解释为文字换行符(不像POSIXecho,默认情况下会这样做)。
标签: bash osx-yosemite