问题描述
我想编写一个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=='
=>没有 !
要能够在不超过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 ": ")))'