如何base64编码/ dev / random或/ dev / urandom?

cat /dev/urandom始终是在您的显示器上创build滚动字符的一种有趣的方式,但会产生太多不可打印的字符。

有没有一种简单的方法可以在命令行中对其进行编码,使得所有的输出都是可读的字符,例如base64或uuencode。

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

那样的事情呢?

 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 

或者,没有(无用的)cat +管道:

 base64 /dev/urandom 

(同种输出^^)

编辑:你也可以使用base64--wrap选项,以避免有“短线”:

 base64 --wrap=0 /dev/urandom 

这将消除包装,你会得到“全屏”显示^^

许多人建议通过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 

那么,什么是错的

 cat /dev/urandom | uuencode - 

修好后,第一次尝试没有实际工作… ::叹:

BTW–许多Unix工具使用“ – ”代替“使用标准输入”的文件名。

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

关于如何对随机数据进行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 < /dev/random stdbuf -o0 tr -Cd '[:graph:]' | stdbuf -o0 head --bytes 32用于生成强密码。

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

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

尝试

 xxd -ps /dev/urandom 

xxd(1)