我试图让base64编码工作并输出到bash脚本中的变量。常规cli语法是:
echo -ne "\0myuser@myhost.com\0mypass" | base64
但是当我尝试将它放入脚本中的变量时它会输出,但是编码非常小,所以我知道它不起作用。我在脚本中的代码是:
auth=$(echo -ne "\0$user@$host\0$pass" | base64);
我知道它与引号有关,但是我尝试过无数的东西,不同的引号,单曲和反斜杠,没有去。
有什么想法吗?
编辑:信息更多一点。这应该通过上面的用户/传递/主机输出:
AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==
但是在脚本中输出:
LW5lIAo=
答案 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)
作为奖励,由于密码(以及用户名和主机)是普通字符串而不是格式字符串,因此在尝试解释其中的转义序列时不会弄得一团糟(您的真实密码是否在其中有反斜杠) ?)