我想把一个打印出一串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,因为我在一个有限的平台上.有没有办法做到这一点?
如果你有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"
以单个换行结束.
如果您要查找单个命令并安装了openssl,请参见下文。生成随机的16个字节(32个十六进制符号)并以十六进制编码(也支持-base64)。
openssl rand -hex 16
我知道有三种方式:
#!/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
使用一个,注释掉另外两个.
这里有一些选项,所有这些选项都具有很好的特性,可以直接选择输出字符串的长度.在下面的所有情况下,只需将"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
编辑:测试不同的贝壳.