BASH Base64编码脚本未正确编码

17

我正在尝试在bash脚本中使用base64编码并将其输出到变量中。常规cli语法为:

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

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

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

我知道这与引号有关,但我已经尝试了各种引号、单引号和反斜杠,但都无法成功。

您有什么想法吗?

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

AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==

但是在脚本中它输出:

LW5lIAo=

1
你确定$user$host$pass已经设置好了吗?很抱歉问一个愚蠢的问题,但必须排除明显的问题。因为在我的测试中,它运行良好,请参见http://pastebin.com/mSR64eEh。 - favoretti
该死的 IT!! 是的他们设置了,我在做那个之前做这个: user="myuser" pass="mypass" host="myhost.com" - jfreak53
看过我的 pastebin 了吗?我编辑过评论,不确定是在你回答之前还是之后 :) - favoretti
等一下!!我刚刚发现了我的问题,我使用的是/bin/sh而不是bash,当我将其更改为/bin/bash时,它就可以正常工作了!!这是怎么回事?!哈哈 - jfreak53
1
@jordanm - 完全同意,尽管许多初学者并没有真正感受到其中的区别 :) - favoretti
显示剩余5条评论
2个回答

27

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

问题在于把 /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=

没错,我刚刚发现它链接到了Dash。那么有什么区别,如果我问一下会怎样呢? - jfreak53
dash仅支持POSIX和一些Berkeley扩展。它有点类似于ksh,但并不具备所有功能,并且比bash少得多。 - favoretti
@jfreak53在这种情况下,很可能是echo使用了非POSIX选项。 - jordanm
嗯,这就显示了我的无知,Dash是Ubuntu 11及以上版本的默认sh shell :) 感谢您的帮助。 - jfreak53
6
使用printf而不是echo,你就不必担心不同Shell之间的差异。 - Barmar
无法处理较长的字符串,会出现换行符。 - Toolkit

13

当你给echo不是纯字符串时,不同版本的echo表现非常不同。有些会解释命令选项(例如-ne),而有些则将其作为输出打印出来;一些会解释字符串中的转义序列(即使没有给定-e选项),有些则不会。

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

user=myuser
pass=mypass
host=myhost.com

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

另外一个额外的好处是,由于密码(以及用户名和主机)是明文字符串而不是格式化字符串,所以在尝试解释它们中的转义序列时不会出现混乱(你的真实密码里有反斜杠吗?)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接