用二进制数据Bash echo命令?

时间:2014-07-16 16:31:40

标签: bash shell binary echo

有人请解释为什么这个脚本有时会以十六进制字符串表示形式返回15个字节吗?

for i in {1..10}; do 
  API_IV=`openssl rand 16`; API_IV_HEX=`echo -n "$API_IV" | od -vt x1 -w16 | awk '{$1="";print}'`; echo $API_IV_HEX; 
done
像这样:

c2 2a 09 0f 9a cd 64 02 28 06 43 f8 13 80 a5 04
fa c4 ac b1 95 23 7c 36 95 2d 5e 0e bf 05 fe f4
38 55 d3 b4 32 bb 61 f4 fd 17 92 67 e2 9b b4 04
6d a7 f8 46 e9 99 bd 89 87 f9 7f 2b 15 5a 17 8a
11 c8 89 f4 8f 66 93 f1 6d b9 2b 64 7e 01 61 68
93 e3 9d 28 95 e1 c8 92 e5 62 d9 bf 20 b3 1c dd
37 64 ef b0 2f da c7 60 1c c8 20 b8 28 9d f9
29 f0 5a e9 cc 36 66 de 02 82 fc 8e 36 bf 5d d1
b2 57 d8 79 21 df 73 1c af 07 e9 80 0a 67 c6 15
ba 77 cb 92 39 42 39 f9 a4 57 c8 c4 be 62 19 54

如果管道" openssl rand 16"直接到od命令然后它工作正常,但我需要二进制值。谢谢你的帮助。

2 个答案:

答案 0 :(得分:4)

与其他标准命令一样,

echo\x00视为字符串结束标记。所以在它之后停止显示。

也许您正在寻找-hex的{​​{1}}选项:

openssl rand

鉴于您的系统上有该选项,您的示例可以重写:

sh$ openssl rand 16 -hex
4248bf230fc9dd927ab53f799e2a9708

如果您需要稍后从 hex转换为字节,请使用此sh$ openssl version OpenSSL 1.0.1e 11 Feb 2013 sh$ for i in {1..10}; do openssl rand 16 -hex | sed -e 's|..|& |g' -e 's| $||' done 20 cb 6b 7a 85 2d 0b fe 9e c7 d0 4b 91 88 1b bb 5d 74 99 5e 05 c9 7d 9d 37 dd 02 f3 23 bb c5 b7 51 e9 0f dc 58 04 5e 30 e3 6b 9f 63 aa fc 95 05 fc 6b b8 cb 05 82 53 85 78 0e 59 13 3b e7 c1 4b cf fa fc d9 1a 25 df e0 f8 59 71 a6 2c 64 c5 87 93 1a 29 b4 5a 52 77 bb 3f bb 1d 0a 46 5d c8 b4 0c bb c2 b2 b4 89 d4 37 1c 86 0a 7a 58 b8 64 e2 ee fc a7 ec 6c f8 7f 51 04 43 d6 00 d8 79 65 43 b9 73 9e cc 4b 42 9e 64 9d 5b 21 6a 20 b7 c3 16 06 8a 15 22 6a d5 ae ab 9a d2 9f 60 f1 a9 26 bd 单行:

perl

(来自https://stackoverflow.com/a/1604770/2363712

请注意我管道到客户端程序,而不是在这里使用shell变量,因为我认为它无法正确处理echo MY_HEX_STRING | perl -ne 's/([0-9a-f]{2})/print chr hex $1/gie' | my_tool_reading_binary_input_from_stdin


由于 bash无法正确处理包含\x00 的二进制字符串,如果您绝对想要坚持使用shell编程,最好的办法就是使用中间文件来存储二进制数据。 变量:

这是的想法。随意适应您的需求:

\x00

作为个人观点,如果你真的有很多二进制数据处理,我建议切换到更多面向数据的其他语言(Python,...)

答案 1 :(得分:2)

因为丢失的字节是ASCII NUL '\0'' \x00'。当echo命令遇到每个参数中的空字节时,它会停止打印其参数。