【问题标题】:Bash script to read from /dev/urandom从 /dev/urandom 读取的 Bash 脚本
【发布时间】:2013-10-07 11:37:32
【问题描述】:

我想制作一个 bash 脚本,它向标准输出发送一个只包含 ASCII 可写字符的文件图像。我的脚本应该只接收和接受一个参数,其中包含应该从/dev/urandom 读取的八位字节数。

所以,我需要从/dev/urandom 中读取给定数量的八位字节,以创建要发送到标准输出的文件图像。

我有这个:

!/usr/bin/env bash

X=1

if [ $X -eq 0 ]; then
    echo "Error: An argument is needed"
else
    strings /dev/urandom    
    echo the result
fi

我正在检查是否有任何争论,如果有,请阅读/dev/urandom。当然这只是一个草图。

有人告诉我有一个名为 strings 的命令可以从任何文件中读取和提取字符序列,但我在互联网上查过,找不到太多关于它的信息。

所以我的问题是:如何从 /dev/random 读取参数中给出的八位字节数,以便我可以将它们放入标准输出(我知道如何放入标准输出:))

【问题讨论】:

  • 关于批量创建随机字符的有趣想法。不确定(并且无法正确测试)bash 是否具有与 ksh、$RANDOM 相同的变量。这是一种更易于管理的替代解决方案,因为您可以一次分配一个,即myRand=$RANDOM; case $myRand in [A-Za-z0-9] * ) word=$word${myRand} ;((wordSize++));; esac 或类似名称。您需要将其包装在一个 while 循环中,该循环根据您的输入 X 监视 wordSize。祝你好运。
  • @shellter 非常感谢,现在将对其进行测试:D
  • hm.. 当我在上面回答时刚刚醒来。现在我注意到 myRand 将是一个数字,而不是一个字符,你需要将整数“转换”为一个字符。出于某种原因,我的内置 printf 没有按预期工作,所以我能做的最好的就是调用像 myChar=$(awk -v num=$myRand 'END{printf("%c", num)}') 这样的 awk 之类的外部程序,并使用 myChar,而不是 myRand。下面的解决方案看起来也不错,这取决于您的需要,或者谁将继续维护您的代码。祝你好运。

标签: bash shell random stdout


【解决方案1】:

strings 不是你想要的。如果您只想将随机字符限制在特定集合中,请过滤掉您不想要的内容。要从/dev/urandom 获取 $num 字母数字字符,您可以:

tr -dc A-Za-z0-9 < /dev/urandom | dd bs=$num count=1 2> /dev/null

tr -dc '[:alnum:]' < /dev/urandom ...

请注意,这不是严格可移植的。尽管tr 的标准规定它应该适用于任何输入文件,但我的版本抛出错误“非法字节序列”。另一种选择是:

perl -pe 's/[^a-zA-Z0-9]//g' /dev/urandom | dd bs=$num count=1 2> /dev/null

【讨论】:

  • @chepner 这是个好主意。我尝试清除 LC_LOCALE 并使用几个不同的值,但都出现相同的错误。欢迎提出使用设置的建议! (OSX 上的 BSD tr 发生错误)
  • 我设法让它与LANG=C tr ... 一起工作。语言环境处理对我来说也有点神秘,所以我不确定是否有更“正确”的方式来处理它。
  • @William Pursell 关于第一个想法:tr -dc A-Za-z0-9 /urandom | dd bs=$num count=1 2> /dev/null count=1 2> /dev/null 的目的是什么?抱歉,如果这是一个愚蠢的问题,但我对此很陌生:) 感谢您的回答
  • dd 有一个不幸的 api。它会喷出有关已复制到 stderr 的数据量的统计信息,2&gt; /dev/null 是为了抑制这一点。需要count=1 以防止dd 尽可能多地复制数据,在这种情况下,这将导致它永远运行(或者直到外部因素导致它终止,例如电源故障或信号。)跨度>
  • @William Pursell 谢谢,现在我明白了 :) 将立即对其进行测试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-17
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多