用base64命令做BASE64编码

Shell 下可以用 base64 命令对数据进行 BASE64 编码,其用法很简单。

编码

1
2
3
4
5
6
7
# 如果数据来自文件,直接指定文件路径
# 该命令将读取文件,对数据进行BASE64编码后输出到屏幕
base64 /path/to/file

# 如果数据来自其他命令的输出,通过管道传到base64命令的标准输入
# 该命令将从标准输入读取数据,并将BASE64编码的结果输出到屏幕
somecmd | base64

解码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 如果BASE64数据来自文件,直接指定文件路径
# -d参数表示解码,命令将读取文件,对数据进行解码后输出到屏幕
base64 -d /path/to/file

# 如果原数据是不适合输出到屏幕的二进制数据
# 最好通过标准输出重定向写到文件
base64 -d /path/to/file > /file/to/save/decoded/data

# 同样BASE64数据也可以是其他命令的输出
somecmd | base64 -d > /file/to/save/decode/data

案例

你猜我是怎么发现这个命令的呢?

当时我在一个容器里面执行 tcpdump 命令抓包,存为 pcap 文件。但容器没有映射额外目录,无法把 pcap 文件传出来。这时可以通过 nc 命令开个端口,通过网络将文件传出来。

但我想了一下,pcap 文件不是很大。如果是纯文本,可以直接 cat 到屏幕就是,但 pcap 不是。那有办法将二进制数据先转换成纯文本吗?这时我就想到了 BASE64 ,然后找到了 base64 这个命令。

因此,我先在容器内将 pcap 文件转化成 BASE64 后输出到屏幕:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
root@ant [ ~ ]  ➜ base64 tcp-upper-lab.pcap
1MOyoQIABAAAAAAAAAAAAAAABABxAAAAzKgcYqeMAQBMAAAATAAAAAAAAAEABkACAgICAgAACABF
AAA85q9AAD0GQAkKAAECCgACArqSJw9SqPQ/AAAAAKACchAXMgAAAgQFtAQCCAr8hH0nAAAAAAED
AwfMqBxivowBAEwAAABMAAAAAAQAAQAGQBERERERAAAIAEUAADwAAEAAQAYjuQoAAgIKAAECJw+6
khfpmLdSqPRAoBJxIBcyAAACBAW0BAIIChe73hr8hH0nAQMDB8yoHGL2jAEARAAAAEQAAAAAAAAB
AAZAAgICAgIAAAgARQAANOawQAA9BkAQCgABAgoAAgK6kicPUqj0QBfpmLiAEADlFyoAAAEBCAr8
hH0nF7veGmOpHGJTXgkASAAAAEgAAAAAAAABAAZAAgICAgIAAAgARQAAOOaxQAA9BkALCgABAgoA
AgK6kicPUqj0QBfpmLiAGADlFy4AAAEBCAr8hs2wF7veGmFiYwpjqRxiZF4JAEQAAABEAAAAAAQA
AQAGQBERERERAAAIAEUAADSKKEAAQAaZmAoAAgIKAAECJw+6khfpmLhSqPREgBAA4xcqAAABAQgK
F74uo/yGzbBjqRxijV4JAEgAAABIAAAAAAQAAQAGQBERERERAAAIAEUAADiKKUAAQAaZkwoAAgIK
AAECJw+6khfpmLhSqPREgBgA4xcuAAABAQgKF74uo/yGzbBBQkMKY6kcYtReCQBEAAAARAAAAAAA
AAEABkACAgICAgAACABFAAA05rJAAD0GQA4KAAECCgACArqSJw9SqPREF+mYvIAQAOUXKgAAAQEI
CvyGzbAXvi6jaakcYrNDCQBRAAAAUQAAAAAAAAEABkACAgICAgAACABFAABB5rNAAD0GQAAKAAEC
CgACArqSJw9SqPREF+mYvIAYAOUXNwAAAQEICvyG5RkXvi6jaGVsbG8gd29ybGQhCmmpHGJPRAkA
UQAAAFEAAAAABAABAAZAEREREREAAAgARQAAQYoqQABABpmJCgACAgoAAQInD7qSF+mYvFKo9FGA
GADjFzcAAAEBCAoXvkYM/IblGUhFTExPIFdPUkxEIQppqRxitUQJAEQAAABEAAAAAAAAAQAGQAIC
AgICAAAIAEUAADTmtEAAPQZADAoAAQIKAAICupInD1Ko9FEX6ZjJgBAA5RcqAAABAQgK/IblGRe+
RgyAqRxiskMJAFMAAABTAAAAAAAAAQAGQAICAgICAAAIAEUAAEPmtUAAPQY//AoAAQIKAAICupIn
D1Ko9FEX6ZjJgBgA5Rc5AAABAQgK/Ic/FBe+RgxmYXNpb25jaGFuLmNvbQqAqRxiqEQJAFMAAABT
AAAAAAQAAQAGQBERERERAAAIAEUAAEOKK0AAQAaZhgoAAgIKAAECJw+6khfpmMlSqPRggBgA4xc5
AAABAQgKF76gB/yHPxRGQVNJT05DSEFOLkNPTQqAqRxiFEUJAEQAAABEAAAAAAAAAQAGQAICAgIC
AAAIAEUAADTmtkAAPQZACgoAAQIKAAICupInD1Ko9GAX6ZjYgBAA5RcqAAABAQgK/Ic/FBe+oAeE
qRxilcsHAEQAAABEAAAAAAAAAQAGQAICAgICAAAIAEUAADTmt0AAPQZACQoAAQIKAAICupInD1Ko
9GAX6ZjYgBEA5RcqAAABAQgK/IdOVBe+oAeEqRxiHcwHAEQAAABEAAAAAAQAAQAGQBERERERAAAI
AEUAADSKLEAAQAaZlAoAAgIKAAECJw+6khfpmNhSqPRhgBEA4xcqAAABAQgKF76vR/yHTlSEqRxi
YswHAEQAAABEAAAAAAAAAQAGQAICAgICAAAIAEUAADTmuEAAPQZACAoAAQIKAAICupInD1Ko9GEX
6ZjZgBAA5RcqAAABAQgK/IdOVBe+r0c=

然后在容器外执行 base64 解码命令:

1
base64 -d > tcp-upper-lab.pcap

拷贝 BASE64 内容输入到 base64 命令,最 ctrl-d 结束数据输入,这样 base64 就将数据解码后写到我指定的文件。这也就间接地实现了我想将文件从容器内拷贝出来的目的,很有趣不是吗?

小菜笔记】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜笔记】系列文章首发于公众号【小菜学编程】,敬请关注: