【问题标题】:Get a specific number of char from /dev/urandom?从 /dev/urandom 获取特定数量的字符?
【发布时间】:2022-05-12 19:45:12
【问题描述】:

我正试图克服 OS X 上“缺乏”一个好的终端工具来生成密码的问题。 这个脚本是来自各种来源的混合体,并且已经在我这边进行了调试(herehereherehere 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 来强制它解释反斜杠字符,但你在 OSX echo 上没有这个功能。
  • bash 内置 echo 无论您在 Linux 还是 OS X 上使用它都一样,并且需要 -e 标志将 \n 解释为文字换行符(不像POSIX echo,默认情况下会这样做)。

标签: bash osx-yosemite


【解决方案1】:

一种选择是同时使用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 将在一行后退出(使用换行符,关闭管道并导致所有命令终止。

【讨论】:

  • 我第一次尝试使用$(),但它没有奏效,也许我也添加了一个语法错误,我很傻:) 现在关于你的代码,我只是想确保我理解: fold -w 32 是否挂起,因为我只是忘记将 /dev/urandom 的输出限制在其第一行?甚至更愚蠢的问题我实际上确实通过 tr 删除了换行符,那么 head -n 1 怎么能做些什么呢? (这不是同一个换行符吗?)
  • 我已经添加了一些解释,希望能让事情更清楚。
  • 哦!谢谢,我现在明白了,所以结果是折线!非常感谢。
【解决方案2】:

也许使用 dd:

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

在 Linux 上,tr -d '\n' 似乎没用,这个人说

[:图形:] 所有可打印字符,不包括空格

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

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多