如何通过命令行获取32位十六进制数字的随机字符串?

Ana*_*Ana 30 random bash

我想把一个打印出一串32个十六进制数字的命令放在一起.我有一个有效的Python脚本:

python -c 'import random ; print "".join(map(lambda t: format(t, "02X"), [random.randrange(256) for x in range(16)]))'
Run Code Online (Sandbox Code Playgroud)

这会生成如下输出:

6EF6B30F9E557F948C402C89002C7C8A 
Run Code Online (Sandbox Code Playgroud)

这就是我需要的.

在Mac上,我甚至可以这样做:

uuidgen | tr -d '-'
Run Code Online (Sandbox Code Playgroud)

但是,我没有访问更复杂的脚本语言ruby和python,我不会在Mac上(所以没有uuidgen).我需要坚持使用更多bash'ish工具,如sed,awk,/ dev/random,因为我在一个有限的平台上.有没有办法做到这一点?

Ren*_*let 57

如果你有hexdump:

hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random
Run Code Online (Sandbox Code Playgroud)

应该做的工作.

说明:

  • -n 16 消耗16个字节的输入(32个十六进制数字= 16个字节).
  • 4/4 "%08X" 迭代四次,每次迭代消耗4个字节,并将相应的32位值打印为8个十六进制数字,如果需要,使用前导零.
  • 1 "\n" 以单个换行结束.

  • @NormanBird 这需要时间,因为 `/dev/random` 很慢。您无法以超高吞吐量读取它。[这个问题](http://stackoverflow.com/questions/4819359/dev-random-extremely-slow) 解释了原因。这不是你使用什么语言的问题。Python 也会有同样的问题。如果您不太关心随机生成器的质量,请尝试使用 `/dev/urandom`。但请确保您首先了解差异。 (2认同)
  • @RenaudPacalet:我建议您更改答案以使用`/dev/urandom`。说它是“低质量”是一个神话。见 https://www.2uo.de/myths-about-urandom/ (2认同)

小智 16

如果您要查找单个命令并安装了openssl,请参见下文。生成随机的16个字节(32个十六进制符号)并以十六进制编码(也支持-base64)。

openssl rand -hex 16
Run Code Online (Sandbox Code Playgroud)

  • @justinpc 当您链接到该文档时,该文档已经过时了。最好了解旧安装的限制,但[自版本 1.1.1 起](https://www.openssl.org/docs/man1.1.1/man1/openssl-rand.html) 尚未应用。 (5认同)
  • 不错的简短解决方案,但它是伪随机的并使用种子文件。它可能不是最安全的解决方案。请参阅:https://www.openssl.org/docs/man1.0.2/man1/openssl-rand.html。 (3认同)

小智 15

我知道有三种方式:

#!/bin/bash

n=16 

# Read n bytes from urandom (in hex):
xxd -l "$n" -p                    /dev/urandom | tr -d " \n" ; echo
od  -vN "$n" -An -tx1             /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"'  /dev/urandom ; echo
Run Code Online (Sandbox Code Playgroud)

使用一个,注释掉另外两个.

  • 以我的经验,“ od”是最常见的。MacOS具有“ hexdump”,“ xdd”和“ od”。Git Bash(MinGW)有xxd和od。基于Alpine Linux的Docker映像具有“ od”(当然还有“ tr”)。并且所有三个平台都有`/ dev / urandom`。因此,如果您正在寻找最便携的产品,那就坚持使用od口味。 (3认同)

cav*_*man 7

这里有一些选项,所有这些选项都具有很好的特性,可以直接选择输出字符串的长度.在下面的所有情况下,只需将"32"更改为所需的字符串长度即可.

#works in bash and busybox, but not in ksh
tr -dc 'A-F0-9' < /dev/urandom | head -c32

#works in bash and ksh, but not in busybox
tr -dc 'A-F0-9' < /dev/urandom | dd status=none bs=1 count=32

#works in bash, ksh, AND busybox! w00t!
tr -dc 'A-F0-9' < /dev/urandom | dd bs=1 count=32 2>/dev/null
Run Code Online (Sandbox Code Playgroud)

编辑:测试不同的贝壳.


Jay*_*van 6

尝试:

xxd -u -l 16 -p /dev/urandom
Run Code Online (Sandbox Code Playgroud)

示例输出:

C298212CD8B55F2E193FFA16165E95E3
Run Code Online (Sandbox Code Playgroud)

并将其转换回二进制:

echo -n C298212CD8B55F2E193FFA16165E95E3 | xxd -r -p
Run Code Online (Sandbox Code Playgroud)