2016-10-05 65 views
1

使用Bash中的base64解码消息(可能包含特殊字符)。保存到文件将产生48个字节的数据。但是,如果将它传递给一个变量,它将变成一个41字节的字符串。我相信这是由Bash处理特殊字符(^ @)的方式造成的。Bash中的字节数组(可能包含特殊字符)

举个例子,

meow_bash=`printf $variable | base64 --decode` 
echo ${#meow_bash} # return 41 

printf $variable | base64 --decode > meow 
wc -c meow # return 48 

现在,如果我不希望保存由于数据的敏感性质以文件的阵列。我也需要使用shell脚本来完成它。有没有办法让我使用bash/sh来成功传递它?

+0

^@是一个nul字节,不能存储为bash变量或作为参数传递给任何程序。不要对bash数据使用bash。您可以存储base64,并在您将其写入任何内容时将其转换。 –

+0

IIRC我也看到bash(我认为它是一个旧版本)被删除字符(十六进制7f)弄糊涂了。根据语言环境的不同,有些工具可能会拒绝处理因此,处理二进制数据的shell工具将采用base64(或十六进制或类似的东西)或通过管道。 –

回答

4

请学会引用您的扩展:使用printf "$variable",不printf $variable

这个最简单的原因是,C变量定义为在零字节结束。
因此c字符串不能包含零字节。
Bash(正在写成c),默默删除变量中的任何零值。

但是可以在流中使用零字节(管道等)。

简单的解决方法是不存储变量内的值(解码后)。

另请注意,变量可能包含以base64编码存储的任何字节值。

因此,变量可以被分配安全 base64编码值:

使用在管内的变量的值擦除没有字节:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ printf '%s' "$variable" | base64 --decode | wc -c 
18 

即:一个流可能包含零值字节。

但分配解码值给变量:

$ variable="YWoAa2hzZ2RrAGxzawBmZGp2" 
$ meow_bash="$(printf '%s' "$variable" | base64 --decode)" 
$ printf '%s' "$meow_bash" | wc -c 
15 
$ echo "${#meow_bash}" 
15 

可变$meow_bash已经失去了3个为零字节。

+0

我想回家的消息将是:不要将任何字节数组直接分配给bash变量,不管... ... – Chong

相关问题