BASH Base64编码脚本编码不正确

时间:2012-09-05 22:07:37

标签: linux bash variables base64

我试图让base64编码工作并输出到bash脚本中的变量。常规cli语法是:

echo -ne "\0myuser@myhost.com\0mypass" | base64

但是当我尝试将它放入脚本中的变量时它会输出,但是编码非常小,所以我知道它不起作用。我在脚本中的代码是:

auth=$(echo -ne "\0$user@$host\0$pass" | base64);

我知道它与引号有关,但是我尝试过无数的东西,不同的引号,单曲和反斜杠,没有去。

有什么想法吗?

编辑:信息更多一点。这应该通过上面的用户/传递/主机输出:

AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==

但是在脚本中输出:

LW5lIAo=

2 个答案:

答案 0 :(得分:12)

好的,我会将此作为记录的答案添加:

问题在于将/bin/sh作为默认解释器shell,我假设在这种情况下是dash

使用的测试脚本:

#!/bin/bash
user=myuser
pass=mypass
host=myhost.com

auth=$(echo -ne "\0$user@$host\0$pass" | base64);

echo $auth

结果:

[51][00:33:22] vlazarenko@alluminium (~/tests) > echo -ne "\0myuser@myhost.com\0mypass" | base64 
AG15dXNlckBteWhvc3QuY29tAG15cGFzcw== 

[52][00:33:42] vlazarenko@alluminium (~/tests) > bash base64.sh
AG15dXNlckBteWhvc3QuY29tAG15cGFzcw== 

[53][00:33:46] vlazarenko@alluminium (~/tests) > dash base64.sh  
LW5lIAo=

答案 1 :(得分:4)

当你给它们除了普通字符串以外的任何东西时,echo的不同版本的行为会有很大不同。有些解释命令选项(如-ne),而有些只是将它们打印为输出;有些人解释了字符串中的转义序列(即使没有给出-e选项),有些则没有。

如果您想要一致的行为,请改用printf

user=myuser
pass=mypass
host=myhost.com

auth=$(printf "\0%s@%s\0%s" "$user" "$host" "$pass" | base64)

作为奖励,由于密码(以及用户名和主机)是普通字符串而不是格式字符串,因此在尝试解释其中的转义序列时不会弄得一团糟(您的真实密码是否在其中有反斜杠) ?)