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

lof*_*ops 542 command-line bash

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

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

Jan*_*ary 782

只需使用base64程序从coreutils包:

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode
Run Code Online (Sandbox Code Playgroud)

或者,包含换行符

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`
Run Code Online (Sandbox Code Playgroud)

输出(包括换行符):

Aladdin:open sesame
Run Code Online (Sandbox Code Playgroud)

  • 或者:`base64 -d <<< QWxhZGRpbjpvcGVuIHNlc2FtZQ==` (86认同)
  • 在 Mac 上,将编码后的字符串复制到剪贴板并运行 `pbpaste | base64 --decode`。 (12认同)
  • 或者:echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode && echo (10认同)
  • `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | "C:\Program Files\Git\usr\bin\base64" --decode 2> nul > example.txt` 在带有 git 的 base64 的 Windows 上。 (4认同)
  • @January 这不是“只是使用”,因为很多人都知道“base64”程序——但是由于不能*只是*插入一个字符串作为命令行选项,因此很难为接触的用户获得正确的语法CLI 只是偶尔使用一次。 (3认同)

gei*_*rha 111

openssl 也可以对 base64 进行编码和解码

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!
Run Code Online (Sandbox Code Playgroud)

编辑: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.
Run Code Online (Sandbox Code Playgroud)

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

Sir*_*rlo 44

干得好!

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

decode () {
  echo "$1" | base64 -d ; echo
}
Run Code Online (Sandbox Code Playgroud)

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

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Run Code Online (Sandbox Code Playgroud)

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


Ama*_*icA 21

使用您的原始依赖项,可以通过对原始脚本稍加修改来做到这一点:

echo $1 | python -m base64 -d
Run Code Online (Sandbox Code Playgroud)

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


小智 17

我在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
Run Code Online (Sandbox Code Playgroud)

警告base64 行长度在 openssl 中默认限制为 64 个字符

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

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='
Run Code Online (Sandbox Code Playgroud)

=> 什么都没有!

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

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

Welcome to openssl wiki with a very long line that splits...
Run Code Online (Sandbox Code Playgroud)

无论如何,这对于实际将 base64 结果拆分为 64 个字符行更好,因为 -A 选项是错误的(长文件限制)。


A.B*_*.B. 7

使用perl

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

或者与python

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
Run Code Online (Sandbox Code Playgroud)