如何从命令行解码base64字符串?


426

我想编写一个bash脚本来解码base64字符串。例如,我键入decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==并打印Aladdin:open sesame并返回到提示。

到目前为止,我已经尝试了一个包含以下内容的简单bash文件,python -m base64 -d $1但该命令期望文件名而不是字符串。是否可以通过命令行运行另一个非交互式命令(不一定在Python模块中)来实现此目的,而无需安装任何其他软件包?(或者,如果这样做的话,则是极小的事情。)

Answers:


630

只需使用base64程序从coreutils包:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

或者,包括换行符

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

输出(包括换行符):

Aladdin:open sesame

10
或:echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode && echo
Greg Chabala 2014年

61
或:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==
jmk

4
echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt在使用git的base64的Windows上。
2016年

3
@January并非如此Just use,因为许多人都对该base64程序有所了解–但由于不能将字符串作为命令行选项插入,因此对于偶尔接触CLI的用户来说,很难获得正确的语法。
Feeela '16

12
在Mac上,将编码后的字符串复制到剪贴板中并运行pbpaste | base64 --decode
玛丽安·塞尔尼

95

openssl还可以编码和解码base64

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

编辑:base64编码的字符串以多行结尾的示例:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'
QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
$ openssl enc -base64 -d << EOF
> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
> EOF
And if the data is a bit longer, the base64 encoded data will span multiple lines.

8
感谢Philippe的回答,您需要为长的base64字符串添加-A,否则openssl将不返回任何内容,请参阅askubuntu.com/a/271676/305568
morloch

@morloch或只是避免从base64编码的数据中删除换行符,并且按预期方式工作...
geirha 2014年

1
我不会考虑coreutils包含程序等“附加”套餐lsmkdircpmv,和chmod。我怀疑如果没有它,您可以对机器执行任何有用的操作。
vidstige 2015年

@vidstige,是的。我不知道为什么会给我一个印象,即默认情况下未安装base64。事实并非如此。
盖尔哈2015年

1
虽然这是Ubuntu的堆叠交换,使用openssl具有优于标准的base64Git中的Bash在Windows上工作的,至少我已经安装上了年纪的Git 1.8.1版本的Bash。
willkil 2015年

38

干得好!

将以下内容添加到~/.bashrc文件的底部:

decode () {
  echo "$1" | base64 -d ; echo
}

现在,打开一个新的终端并运行命令。

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

这将完全按照您在问题中的要求进行。


20

使用原始的依赖关系,可以对原始脚本进行较小的修改来完成此操作:

echo $1 | python -m base64 -d

如果您不传递文件名,则该python模块将从标准输入中读取。要将第一个参数导入其中,可以使用echo $1 |


1
另外:python -m base32文件名
kenorb 2012年

1
这不起作用:)但使用.b32 *方法
rzr14年

13

我在http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities中注释了base64命令行。所以我在使用openssl base64解码时发出警告:

 openssl base64 -e <<< 'Welcome to openssl wiki'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

在openssl中,默认情况下,警告base64行长限制为64个字符

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

=>一无所有!

为了能够解码没有换行符超过64个字符的base64行,请使用-A选项:

openssl base64 -d -A <<<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

Welcome to openssl wiki with a very long line that splits...

无论如何,这实际上更好地将base64分割成64个字符的行,因为-A选项是BUGGY(长文件的限制)。


4

使用 perl

perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

还是一样 python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

2

只是添加另一种方法:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.