gpt4 book ai didi

string - 在 bash 中使用随机可打印字符串创建特定大小的文件

转载 作者:行者123 更新时间:2023-11-29 09:18:00 25 4
gpt4 key购买 nike

我想在 bash 中创建一个只包含可打印字符串的特定大小的文件。

我的第一个想法是使用/dev/urandom:

dd if=/dev/urandom of=/tmp/file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 10,3641 s, 10,1 MB/s

file /tmp/file && du -h /tmp/file
/tmp/file: data
101M /tmp/file

这给我留下了一个我想要的大小的文件,但不仅包含可打印的字符串。

现在,我可以使用 strings 创建一个只包含可打印字符串的文件。

cat /tmp/file | strings > /tmp/file.txt
file /tmp/file.txt && du -h /tmp/file.txt
/tmp/file.txt: ASCII text
7,0M /tmp/file.txt

这给我留下了一个只包含可打印字符串的文件,但文件大小错误。

长话短说

如何在 bash 中创建一个特定大小的文件,只包含可打印的字符串?

最佳答案

正确的方法是使用像base64这样的转换将随机字节转换为字符。这不会从源中删除任何随机性,它只会将其转换为其他形式。
对于大小为 1 兆字节的(稍微大一点的)文件:

dd if=/dev/urandom bs=786438 count=1 | base64 > /tmp/file

生成的文件将包含 A–Za–z0–9+/= 范围内的字符。

下面是文件有点大的原因,以及解决方法。

您可以使用 tr 添加过滤器以从该列表转换为其他列表(大小相同或更小)。

cat /tmp/file | tr 'A-Za-z0-9+/=' 'a-z0-9A-Z$%'

我将 = 留在了翻译之外,因为对于均匀的随机分布,最好省略最后一个(几乎)总是 = 的字符。

大小

文件的大小将从/dev/random 使用的原始大小扩展为 4/3。这是因为我们将 256 个字节的值转换为 64 个不同的字符。这是通过从字节流中取出 6 位来对每个字符进行编码来完成的。当编码了 4 个字符(6*4=24 位)时,只消耗了三个字节(8*3=24)。

因此,我们需要字节数是 3 的倍数才能得到准确的结果,还需要字节数是 4 的倍数,因为我们必须除以它。
我们无法得到恰好 1024 字节 (1k) 或 1024*1024 = 1,048,576 字节 (1M) 的随机文件,因为两者都不是 3 的精确倍数。但是我们可以生成一个稍大一点的文件并截断​​它(如果这样的精度是需要):

wanted_size=$((1024*1024))
file_size=$(( ((wanted_size/12)+1)*12 ))
read_size=$((file_size*3/4))

echo "wanted=$wanted_size file=$file_size read=$read_size"

dd if=/dev/urandom bs=$read_size count=1 | base64 > /tmp/file

truncate -s "$wanted_size" /tmp/file

截断为精确值的最后一步是可选的。

随机生成。

由于您要从 urandom 中提取如此多的随机值,请不要使用 random(使用 urandom),否则您的应用将被长时间阻塞,而计算机的其余部分将正常工作没有随机性。

我建议您安装 haveged 包:

haveged uses HAVEGE (HArdware Volatile Entropy Gathering and Expansion) to maintain a 1M pool of random bytes used to fill /dev/random whenever the supply of random bits in dev/random falls below the low water mark of the device.

如果可能的话。

关于string - 在 bash 中使用随机可打印字符串创建特定大小的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40926789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com