【问题标题】:BASH Base64 Encode script not encoding rightBASH Base64 编码脚本编码不正确
【发布时间】:2012-08-30 16:57:56
【问题描述】:

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

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

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

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

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

有什么想法吗?

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

AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==

但在它输出的脚本中:

LW5lIAo=

【问题讨论】:

  • 您确定$user$host$pass 已设置吗?对不起一个愚蠢的问题,但必须排除明显的东西。因为在我的测试中它工作正常,见pastebin.com/mSR64eEh
  • 该死!!是的,他们的设置,我在这样做之前就这样做了:user="myuser" pass="mypass" host="myhost.com"
  • 看到我的粘贴箱了吗?编辑了我的评论,不确定你回答之前还是之后:)
  • 是的,我以前看过它,这很奇怪,我有完全相同的东西,但不行:(
  • @jordanm - 完全同意,尽管许多初学者并没有真正感受到区别:)

标签: linux bash variables base64


【解决方案1】:

好的,为了记录,我会添加这个作为答案:

问题在于将/bin/sh 作为默认解释器外壳,我假设在本例中为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。那么,如果我可以问的话,有什么区别?
  • dash 仅是 POSIX + 一些 berkeley 扩展。它有点像ksh,但也不具备所有功能,而且功能远不如bash
  • @jfreak53 在这种情况下,可能是echo 的非POSIX 选项。
  • 嗯,告诉你我所知道的,Dash 是 Ubuntu 11 及更高版本的默认 sh shell :) 感谢您的帮助。
  • 使用printf 而不是echo,您不必担心shell 之间的差异。
【解决方案2】:

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

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

user=myuser
pass=mypass
host=myhost.com

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多