我想编写一个bash脚本来解码base64字符串。例如,我键入decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==并打印Aladdin:open sesame并返回到提示符。到目前为止,我已经尝试了一个包含python -m base64 -d 的简单bash文件,但是此命令要求使用文件名而不是字符串。是否可以通过命令行运行另一个非交互式命令(不一定在Python模块中)来实现此目的,而不必安装任何其他软件包? (或者,如果我这样做,则是极小的事情。)

#1 楼

只需使用base64软件包中的coreutils程序:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode


,或包含换行符

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


输出(包括换行符):

Aladdin:open sesame


评论


或:echo QWxhZGRpbjpvcGVuIHNlc2FtZQ == | base64 --decode &&回声

–格雷格·查巴拉(Greg Chabala)
2014年9月4日在16:08

或:base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ ==

– jmk
15年7月29日在11:23

回声QWxhZGRpbjpvcGVuIHNlc2FtZQ == | “ C:\ Program Files \ Git \ usr \ bin \ base64” --decode 2> nul> example.txt在Windows上使用git的base64。

–火
16 Sep 19 '18:03



@January这并不是唯一使用的方法,因为许多人都知道base64程序–但是由于不能仅将字符串作为命令行选项插入,因此对于仅一次接触CLI的用户来说,很难获得正确的语法而。

–feeela
16年11月15日在14:04

在Mac上,将编码后的字符串复制到剪贴板中并运行pbpaste | base64 --decode。

–MariánČerný
17年9月21日在11:15

#2 楼

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.


评论


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

– Morloch
2014年10月2日在6:02



@morloch或只是避免从base64编码数据中删除换行符,它可以按预期工作...

– Geirha
14-10-2在7:56



我不会将coreutils视为包含诸如ls,mkdir,cp,mv和chmod之类的程序的“附加”软件包。我怀疑如果没有它,您可以对机器执行任何有用的操作。

– vidstige
15年1月15日在20:14

@vidstige,是的。我不知道为什么会给我一个印象,即默认情况下未安装base64。完全不是这样。

– Geirha
15年1月16日在14:26

虽然这是ubuntu堆栈交换,但使用openssl优于在Windows的Git Bash中工作的标准base64上,至少我已经安装了较旧的1.8.1 Git Bash版本。

– willkil
15年6月16日在23:05

#3 楼



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

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


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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==


这将完全满足您在问题中的要求。

#4 楼

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

echo  | python -m base64 -d


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

评论


另外:python -m base32文件名

– Kenorb
2012年11月10日22:57

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

– rzr
14年2月16日在11:11

#5 楼

我在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


=>没什么!

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

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

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


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

评论


openssl Wiki文档已移至wiki.openssl.org/index.php/…,然后重写了它-A的用法和64个字符的限制。

– philippe lhardy
6月14日15:38



#6 楼

使用perl

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


或与python

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

相同

#7 楼

只需添加另一种方法即可:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'


#8 楼

我花了一些时间来讨论这一问题,因为Linux工具base64openssl确实可以解码。但是我有这个特殊的base64编码文件,它会解码为稍微错误的值。几个字节确实匹配,但是当我在EF BF BD EF BF BD查看器中查看时,则存在hexedit。然后,当与正确解码的预期输出进行比较时,下一个字节序列再次匹配。这些奇怪的字节序列被插入到中间,有时只是EF BF BD
要解决此问题,我必须查看Java发送方如何对其进行编码,然后创建了一个小型Java base64解码器。现在我可以将其解码为期望值了。
这是执行此操作的小片段:https://gist.github.com/typelogic/0567cdab6c15487c31496cb90006ff52