如何对/dev/random或/dev/urandom进行base64编码?

45

cat /dev/urandom 是在显示器上创建滚动字符的有趣方式,但产生了过多的不可打印字符。

是否有一种简单的命令行编码方式,使其所有输出都是可读字符,例如base64或uuencode。

请注意,我更喜欢不需要创建其他文件的解决方案。


18
你在对于“有趣”的定义上肯定是与众不同的。 - Stefano Borini
7个回答

69

那么类似这样的东西怎么办呢?

cat /dev/urandom | base64

这会提供(大量的)类似以下的东西:

hX6VYoTG6n+suzKhPl35rI+Bsef8FwVKDYlzEJ2i5HLKa38SLLrE9bW9jViSR1PJGsDmNOEgWu+6
HdYm9SsRDcvDlZAdMXAiHBmq6BZXnj0w87YbdMnB0e2fyUY6ZkiHw+A0oNWCnJLME9/6vJUGsnPL
TEw4YI0fX5ZUvItt0skSSmI5EhaZn09gWEBKRjXVoGCOWVlXbOURkOcbemhsF1pGsRE2WKiOSvsr
Xj/5swkAA5csea1TW5mQ1qe7GBls6QBYapkxEMmJxXvatxFWjHVT3lKV0YVR3SI2CxOBePUgWxiL
ZkQccl+PGBWmkD7vW62bu1Lkp8edf7R/E653pi+e4WjLkN2wKl1uBbRroFsT71NzNBalvR/ZkFaa
2I04koI49ijYuqNojN5PoutNAVijyJDA9xMn1Z5UTdUB7LNerWiU64fUl+cgCC1g+nU2IOH7MEbv
gT0Mr5V+XAeLJUJSkFmxqg75U+mnUkpFF2dJiWivjvnuFO+khdjbVYNMD11n4fCQvN9AywzH23uo
03iOY1uv27ENeBfieFxiRwFfEkPDgTyIL3W6zgL0MEvxetk5kc0EJTlhvin7PwD/BtosN2dlfPvw
cjTKbdf43fru+WnFknH4cQq1LzN/foZqp+4FmoLjCvda21+Ckediz5mOhl0Gzuof8AuDFvReF5OU

或者,不使用(无用的)catpipe

base64 /dev/urandom

(输出结果相同^^)


编辑:你也可以使用--wrap选项的base64命令,以避免出现“短行”:

base64 --wrap=0 /dev/urandom
这将消除包裹,您将获得“全屏”显示^^

26
我现在所看到的只有金发、棕发和红发。 - alexanderpas
@Stefano: 我也是哈哈😄; @alexanderpas: 如果看到随机滚动的字符会让你看到那种字符,也许我应该更经常看随机字符呢^^ - Pascal MARTIN
@alexanderpas:cat /dev/urandom | uuencode - | tr -d '0-9' | sed -e 's/([@$&~#(?)+<>^;])/^[[1m^[[32m\1^[[0m/g' | sed -e 's/([*!])/^[[30m\1^[[0m/g' | sed -e 's/([A-Z])/^[[32m\1^[[0m/g' | tr -d '\n' # 1) 将 ^[ 转换为 ctrl-v esc,然后粘贴 2) 可以改进,但现在我很累 ;) - Stefano Borini
3
base64 --wrap=0 /dev/urandom |head -c 100 可以获取100个随机的base64字符。如果你正在寻找一个基于bash的Matrix风格屏幕保护程序,之前已经有人做过了 :-) - Adam Katz
1
head -c128 /dev/urandom | base64 --wrap=0,为了避免破坏管道,请按原样返回翻译后的文本 @AdamKatz。 - sebastian
@sebastian - 是的,但这不应该是问题,而且您的方法需要一些试错(或将其管道传输到另一个调用中,“head -c 100”)才能获得正确的输出字符计数(小心,您不想要尾随的“=”字符!)。尝试使用“head -c 75 /dev/urandom |base64 -w 0”生成100个字符。 - Adam Katz

23

有些人建议使用cat和管道通过base64uuencode进行转换。但这样做存在一个问题,你无法控制要读取多少数据(它会一直持续下去,或者直到按下ctrl+c为止)。另一个可能性是使用dd命令,它可以让您在退出之前指定要读取的数据量。例如,要读取1kb:

dd if=/dev/urandom bs=1k count=1 2>/dev/null | base64

另一种选择是使用管道命令 strings,它可以提供更多的输出变化(非可打印字符被丢弃,默认情况下显示至少 4 个可打印字符的任意运行)。问题在于 strings 将每个“运行”单独显示在自己的一行上。

dd if=/dev/urandom bs=1k count=1 2>/dev/null | strings

(当然可以用以下命令来代替整个命令

strings /dev/urandom

如果你不想它永远停止,可以尝试:

如果你想要一些真正新奇的东西,可以尝试以下之一:

cat -v /dev/urandom
dd if=/dev/urandom bs=1k count=1 2>/dev/null | cat -v

4
例如,head -c 100 将打印文件的前100个字节。 - Mark Rushakoff
如果使用字符串,您还可以使用额外的管道删除换行符:strings /dev/urandom | perl -pe 's/\n//' - mivk

5

那么,有什么问题吗?

(关于 IT 技术)
cat /dev/urandom | uuencode -

第一次尝试没有成功,修复后问题已解决...:: 唉::

顺便说一句 - 许多 Unix 实用程序使用“-”代替文件名表示“使用标准输入”。


不知道有横线选项,谢谢你教我;) - alexanderpas
无用的cat使用 - 改用以下方式:uuencode /dev/random - - Dennis Williamson

4
已经有几个很好的回答介绍如何对随机数据进行base64编码(即cat /dev/urandom | base64)。但是在问题的主体中,您进行了详细说明:

…对[urandom]进行命令行编码,使其所有输出都是可读字符,例如base64或uuencode。

鉴于您实际上不需要可解析的base64,只是想要它可读,我建议

cat /dev/urandom | tr -dC '[:graph:]'

base64 只能输出字母数字及两个符号 (+ 和 / 默认情况下)。而 [:graph:] 则匹配任何可打印的非空格 ASCII 字符,包括许多符号/标点,这些在 base64 中是缺失的。因此使用 tr -dC '[:graph:]' 将产生更随机的输出,并具有更好的输入/输出效率。

我经常使用 < /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32 来生成强密码。


无用的cat使用(UUoC)-- 考虑改用tr -dC '[:graph:]' </dev/urandom - RubyTuesdayDONO

1
cat /dev/urandom | tr -dc 'a-zA-Z0-9'

3
那不是正确的方法。它不是Base64,转换缺少两个符号,因此更像是Base62,因此解码值将会有偏差,例如不太随机。 - Yann Droneaud

1

使用BASH的FIFO管道,您可以做更有趣的事情:

uuencode <(head -c 200 /dev/urandom | base64 | gzip)

-2

尝试

xxd -ps /dev/urandom

{{link1:xxd(1)}}


1
这将产生十六进制/Base16而不是Base64。 - Aaron J Lang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接