如何通过命令行对base64进行编码?


215

在Mac OS X中,是否存在将base64编码为文件或标准输入的终端命令?


5
请注意,尽管从一个操作系统到另一个操作系统,base64编码语法是一致的,但是base64解码语法是base64 -d还是base64 -D取决于您的操作系统。OSX使用-D
克里斯·约翰逊

@ChrisJohnson如果与openssl标志一起使用,则-d在OS X(10.10 Yosemite)上使用。
ᴠɪɴᴄᴇɴᴛ

Answers:


229

openssl可以为您完成此操作,并且默认情况下,它们都已随OS X一起安装;无需安装darwinports。

$ openssl base64 -in <infile> -out <outfile>

如果没有-in选项,则从标准输入中读取


79
使用openssl base64 < path/to/file.png | tr -d '\n' | pbcopycat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy跳过写入文件的过程,只需将base64编码的输出复制到剪贴板,而无需换行。
Mathias Bynens 2011年

3
并使用-d标志进行解码。
肯尼2013年

5
在Mac中,To base64编码一个字符串:openssl base64 -e <<< ram并解码:openssl base64 -d <<< cmFtCg==
Ram Patra

8
@mathias(如果您不希望使用换行符)openssl base64 [-e] -A。+ @kenny进行解码,如果输入最多每76个字符没有换行符,包括我刚才说的无换行符情况,则需要,-d -A否则您将丢失或损坏数据而没有错误消息(尽管有未决的错误报告,可能会导致此问题的解决)。
dave_thompson_085

2
@Ram openssl base64 -e <<< ram实际上编码4个字节,包括尾随换行;见hexdump <<< ram
Arjan 2015年

92

Openssl可以更简洁地使用:

echo -n 'input' | openssl base64

[必须使用echo -n->,否则将进行编码,包括换行符]

要么

openssl base64 <ENTER> [type input] <CTRL+D>

10
不过,“ echo”解决方案将LF(换行符)字符添加到输入字符串的末尾。更好的使用:echo -n '输入'
SuperTempel

7
甚至更加简洁openssl base64 <<< input
Garrett Fogerlie 2013年

2
或者只使用base64不带openssl。无论哪种方式,我都需要按两次Ctrl + D。而且要注意,@Garret:在Bash中,有或没有opensslopenssl base64 <<< superuseropenssl base64 <<< "superuser" 错误地产生c3VwZXJ1c2VyCg==,正如“这里字符串”,那么仍然包括换行!(显然,不仅在Bash中,而且在zsh,ksh和yash中也是如此。请参见hexdump <<< superuser。Base64结果应该是c3VwZXJ1c2Vy。)
Arjan

@Arjan我会毫不犹豫地使用“错误地”一词-如您所指出的,这里的字符串包含换行符,但是出于充分的理由-unix.stackexchange.com/questions/20157/…echo -n如果不需要换行,则首选。这肯定是要注意的。
史蒂夫·弗利

2
您可以printf代替echo -n
Jason

50

尝试使用:

base64 -i <in-file> -o <outfile>

默认情况下,它应该在OS X上可用。


1
添加--decode以将过程从base64还原为正常。
luckydonald

1
这对于SVG编码比较好,因为它会创建一行。这比的输出干净openssl base64。谢谢!
Shanimal

32

base64 默认情况下,该命令在我的OS X 10.9.4上可用。

您可以使用base64 <<< stringbase64 -D <<< string编码,并在终端进行解码的字符串,或base64 -in filebase64 -D -in file编码和解码的文件。


你有例子吗?我Invalid characer in input stream在使用<<<... 时遇到了问题"'但在字符串中没有任何尝试。
乔纳斯(Jonas)

@Jonas你在什么壳里?您可以在bash和zsh中使用它。
WKPlus

啊,没关系,它有效!
乔纳斯(Jonas)

8

由于默认情况下OS X提供了Python,因此您可以按以下方式使用它:

$ echo FOO | python -m base64
Rk9PCg==
$ echo Rk9PCg== | python -m base64 -d
FOO

coreutils通过Brewbrew install coreutils)安装,它将提供base64命令:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO

5

在速度方面,我将先使用openssl,再使用perl,再使用uuencode。在可移植性方面,我会先使用uuencode,再使用Perl,再使用openssl(如果您关心在尽可能多的其他UNIX(如库存平台)上重用代码)。但是要小心,因为并非所有的UNIX变体都支持-m开关(iirc AIX支持,HP / UX支持,Solaris不支持)。

$ time perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' \
> out.jpg 1>filename.b64
real    0m0.025s

$ time uuencode -m -o filename.b64 out.jpg filename_when_uudecoded.txt
real    0m0.051s

$  time openssl base64 -in out.jpg -out filename.b64 
real    0m0.017s

使用-m开关每进行uuencode的base64 file_in.txt由指定的RFC1521和(解码时filename_when_uudecoded.txt作为默认的文件名)写它filename.b64:

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt

STDIN示例:

cat file_in.txt | uuencode -m -o filename.b64 filename_when_uudecoded.txt

5

您还可以将其直接传输到剪贴板(至少在Mac上是这样):

openssl base64 -in [filename] | pbcopy


高尔夫:base64 < [filename] | pbcopy
乡村民宿

5

在macOS上,我始终使用:

echo -n "STRING" | base64

-n避免在行尾出现换行符。


3

蟒蛇

如今,Python已预装在所有Mac上。

在终端运行python(或ipython)。

编码文件:

 base64data = open('myfile.jpg','rb').read().encode('base64')
 open('myfile.txt','w').write(base64data)

解码文件:

data = open('myfile.txt').read().decode('base64')
open('myfile.jpg','wb').write(data)

当然,这两种操作都可以转换为一个单行,但是这样更易读。

的OpenSSL

## encode to base64 (on OSX use `-output`)
openssl base64 -in myfile.jpg -output myfile.jpg.b64

## encode to base64 (on Linux use `-out`)
openssl base64 -in myfile.jpg -out myfile.jpg.b64


## decode from base64 (on OSX `-output` should be used)
openssl base64 -d -in myfile.jpg.b64 -output myfile.jpg

## decode from base64 (on Linux `-out` should be used)
openssl base64 -d -in myfile.jpg.b64 -out myfile.jpg

省略-out/ -output... filename将打印到标准输出。

base64

OSX和Ubuntu中都存在另一个ootb实用程序:

## encode to base64
base64 < myfile.jpg > myfile.jpg.b64

## decode from base64 (OSX) (note the uppercase 'D')
base64 -D < myfile.jpg.b64 > myfile.jpg

## decode from base64 (Linux) (note the lowercase 'd')
base64 -d < myfile.jpg.b64 > myfile.jpg

2
uuencode -m [-o output_file] [file] name

其中,name是要在编码的标头中显示的名称。

例:

cat docbook-xsl.css | uuencode -m docbook-xsl.css

要么

uuencode -m -o docbook-xsl.css.b64 docbook-xsl.css docbook-xsl.css

uuencode不是编码为base64
ccpizza

2

由于某种原因,echo -n <data> | openssl base64在我的base64数据中间添加了换行符。我认为这是因为我的base64数据非常长。

使用echo -n <data> | base64编码和echo -n <base64-ed data> | base64 -D解码效果很好。


nb:在我的nix上,我必须使用-d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser:somepassword
mlo55 '16

2

除上述Steve Folly的答案外,在以stdin模式加密时,为避免传递额外的换行符,请按CTRL + D两次以结束输入而没有任何其他换行符。输出将显示在同一行之后。

例如:

$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$

或者,您可以使用printf

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

有Perl加上MIME :: Base64:

perl -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}'

这是预装的。您可以在命令行上指定单独的文件(或在标准输入中提供数据)。每个文件都单独编码。您也可以:

perl -i.txt -MMIME::Base64 -e 'undef $/;while(<>){print encode_base64($_);}' file1

这会将file1备份到file1.txt,并将Base-64编码的输出写到原始文件上。


1

一个简单的NodeJS版本:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"

我不认为这是一个更好的答案,因为openssl(现在base64)是操作系统附带的。
2015年

冒着分裂头发的危险(而且我知道这种批评也适用于其他几个答案),该问题询问如何对文件stdin进行编码。如果我没记错的话,您的答案只会显示如何编码字符串。
G-Man

1

重新编码应该为您解决问题

recode ../b64 < file.txt > file.b64

可通过MacPorts在OS X上使用recode 。


没有内置的东西吗?
乔什

@Josh -有- OpenSSL的
史蒂夫愚蠢

MacPorts不附带任何OS X发行版。还有很多其他选择。例如只是base64命令。
杰森S

1

如果您使用base64编码字体文件,则可以执行以下操作:

base64 my-webfont.ttf > my-webfont.b64.ttf.txt

我一直在Mac(10.10)上使用它。

注意:不会有换行符。


1

跨平台解决方案

我们编译了一系列跨平台的shell命令,以将文件编码为base64。以下命令获取输入文件(deploy.key在示例中命名),然后将其转换为base64,而无需换行。base64输出通过stdout打印到终端。

# For systems with openssl
openssl base64 -A -in=deploy.key

# For systems with Python (2 or 3) installed
python -c "import base64; print(base64.standard_b64encode(open('deploy.key', 'rb').read()).decode())"

# For Windows or Linux systems that have the GNU coreutils base64 command
base64 --wrap=1000000 deploy.key

# For macOS systems
base64 --break=1000000 deploy.key

要将输出重定向到文件,请追加> base64-encoded.txt(使用您选择的文件名)。

这些命令的原型是此请求的一部分,在此我们希望跨平台的shell命令以base64编码SSH私钥以删除换行符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.