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

问题描述 投票:22回答:4

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

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

这会生成如下输出:

6EF6B30F9E557F948C402C89002C7C8A 

这就是我需要的。

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

uuidgen | tr -d '-'

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

bash random
4个回答
50
投票

如果你有hexdump那么:

hexdump -n 16 -e '4/4 "%08X" 1 "\n"' /dev/random

应该做的工作。

说明:

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

注意:此解决方案使用/dev/random但它也可以使用/dev/urandom。两者之间的选择是一个复杂的问题,超出了这个答案的范围。如果您不确定,请查看this other question


13
投票

我知道有三种方式:

#!/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

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


9
投票

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

openssl rand -hex 16

6
投票

这里有一些选项,所有这些选项都具有很好的特性,可以直接选择输出字符串的长度。在下面的所有情况下,只需将“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

编辑:测试不同的贝壳。

© www.soinside.com 2019 - 2024. All rights reserved.