12

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

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

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

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

我知道这与引号有关,但我已经尝试了无数不同的引号和单引号和反斜杠,但没有成功。

有什么想法吗?

编辑:更多信息。这应该与上面的用户/通行证/主机一起输出:

AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==

但在脚本中它输出:

LW5lIAo=
4

2 回答 2

24

好的,为了记录,我将其添加为答案:

问题在于/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=
于 2012-09-05T22:34:41.623 回答
7

echo当您给它们提供除纯字符串以外的任何内容时,不同版本的行为会非常不同。有些解释命令选项(如-ne),而有些只是将它们打印为输出;有些解释字符串中的转义序列(即使没有给出-e选项),​​有些则没有。

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

user=myuser
pass=mypass
host=myhost.com

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

作为奖励,由于密码(以及用户名和主机)是纯字符串而不是格式字符串,因此尝试解释其中的转义序列不会造成混乱(您的真实密码中是否有反斜杠?)

于 2012-09-05T23:52:09.863 回答