Base64编码在脚本中有所不同

时间:2019-10-22 15:45:12

标签: bash authentication encoding base64

我正在尝试在bash脚本中对user:password字符串进行base64编码,但是该脚本中的结果与在shell中运行命令的结果不同。

在外壳中(预期输出):

echo -n "user:password" | base64
dXNlcjpwYXNzd29yZA==

在脚本中(带-n):

USER=$(echo -n "user:password" | base64)
echo $USER
LW4gdXNlcjpwYXNzd29yZAo=

在脚本中(不带-n,结尾处有多余的字符):

USER=$(echo "user:password" | base64)
echo $USER
dXNlcjpwYXNzd29yZAo=

有人可以告诉我我在这里想念的东西吗?谢谢

1 个答案:

答案 0 :(得分:3)

通过使用#!/bin/sh shebang,您最有可能要求bash(或/bin/sh后的任何shell(如今几乎总是指向另一个shell的链接))执行脚本在POSIX兼容模式下:

  

如果使用名称sh调用bash,则它会尝试尽可能模仿sh的历史版本的启动行为,同时也要符合POSIX标准。

您的问题是POSIX echo没有定义-n标志,因此在您的命令中将其理解为仅在输出中显示的另一个参数。实际上,LW4gdXNlcjpwYXNzd29yZAo=-n user:password的base64编码。

您应该使用printf代替echo,后者的行为定义得更好,并且在实现之间的差异也较小。

此外,除非您需要脚本可移植并且可以在无法使用bash的平台上运行,否则建议您使用#!/usr/bin/env bash shebang代替#!/bin/sh您将享受bash的美味。