我想把一个打印出一串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,因为我在一个有限的平台上。有没有办法做到这一点?
答案 0 :(得分:49)
如果您有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。
答案 1 :(得分:12)
我知道三种方式:
#!/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
使用一个,注释掉其他两个。
答案 2 :(得分:8)
如果您要查找单个命令并安装了openssl,请参见下文。生成随机的16个字节(32个十六进制符号)并以十六进制编码(也支持-base64)。
openssl rand -hex 16
答案 3 :(得分: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
编辑:在不同的shell中测试。
答案 4 :(得分:4)
尝试:
xxd -u -l 16 -p /dev/urandom
示例输出:
C298212CD8B55F2E193FFA16165E95E3
并将其转换回二进制:
echo -n C298212CD8B55F2E193FFA16165E95E3 | xxd -r -p
答案 5 :(得分:0)
如果要生成任意长度的输出,包括偶数/奇数字符:
cat /dev/urandom | hexdump --no-squeezing -e '/1 "%x"' | head -c 31
或者在可读性/可组合性方面最大化效率:
hexdump --no-squeezing -e '/1 "%x"' -n 15 /dev/urandom