当前位置: 首页>>技术问答>>正文


我怎样才能从命令行解码base64字符串?

, ,

问题描述

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

到目前为止,我已经尝试了一个简单的包含python -m base64 -d $1的bash文件,但是这个命令需要的文件名不是字符串。是否有另一个non-interactive命令(不一定在Python模块中)可以从命令行运行来实现此目的,而无需安装任何额外的软件包? (或者如果我这样做,super-minimal。)

最佳解决思路

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

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

或者,包含换行符

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

输出(包括换行符):

Aladdin:open sesame

次佳解决思路

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.

第三种解决思路

干得好!

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

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

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

这将完全符合你在你的问题中所要求的。

第四种思路

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

echo $1 | python -m base64 -d

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

第五种思路

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

=&GT;没有 !

要能够在不超过64个字符的换行情况下解码base64行,请使用-A选项:

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

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

因为-A选项是BUGGY(限制长文件),所以对于实际的64位分割base64结果更好。

第六种思路

使用perl

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

或者与python相同

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

第七种思路

只是添加另一种方式来做到这一点:

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/110.html,未经允许,请勿转载。