2010-03-16 23:15:37 +0000 2010-03-16 23:15:37 +0000
243
243

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

Mac OS X中是否有一个终端命令可以对文件或stdin进行base64编码?

答案 (17)

252
252
252
2010-03-17 00:25:08 +0000
$ openssl base64 -in <infile> -out <outfile>

&001

openssl 如果没有 stdin 选项,则从 stdin 中读取。

107
107
107
2010-04-21 06:12:44 +0000

Openssl可以更简洁地使用:

echo -n 'input' | openssl base64

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

openssl base64 <ENTER> [type input] <CTRL+D>
54
54
54
2015-02-27 20:13:36 +0000

尝试使用:

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

,在OS X上应该是默认可用的。

34
34
34
2016-03-17 02:48:49 +0000

base64命令在我的OS X 10.9.4中默认是可以使用的。

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

16
16
16
2017-08-01 05:33:00 +0000

在macOS上,我总是使用:

echo -n "STRING" | base64

-n是为了避免在行的末尾出现新的行字。

8
8
8
2015-05-25 17:19:49 +0000

由于Python默认是在OS X中提供的,所以你可以通过以下方式使用。

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

或者通过 Brew (coreutils) 安装 brew install coreutils,它将提供 base64 命令:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
5
5
5
2012-09-05 07:43:32 +0000

在速度方面,我会使用openssl,其次是perl,然后是uuencode。在可移植性方面,我会使用uuencode,然后是Perl,最后是openssl(如果你想在尽可能多的其他UNIX平台上重用代码的话)。但要小心,因为不是所有的UNIX变种都支持 -m开关(AIX支持,HP/UX支持,Solaris不支持)。 txt,并将其写入 filename.b64 (在解码时,用 filename_when_uudecoded.txt 作为默认的文件名):

$ 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

STDIN 示例:

uuencode -m -o filename.b64 file_in.txt filename_when_uudecoded.txt
5
5
5
2016-07-12 15:39:22 +0000

你也可以把它直接管到剪贴板上(至少在mac上):

openssl base64 -in [filename] | pbcopy

3
3
3
2014-06-17 10:00:25 +0000

Python

现在所有的mac上都预装了Python,在终端中运行python(或ipython )。

OpenSSL

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)

#base64

另一个OTB工具在OSX和Ubuntu中都有:

## 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
2
2
2
2014-07-27 05:16:22 +0000

不知道为什么,echo -n <data> | openssl base64在我的base64数据中间加了一个新行。我想这是因为我的base64数据太长了。

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

2
2
2
2013-04-04 20:12:06 +0000
uuencode -m [-o output_file] [file] name

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

2
2
2
2016-07-27 18:14:32 +0000

除了上面Steve Folly的回答之外,在stdin模式下加密时,为了避免传递额外的换行,按两次CTRL+D结束输入,不需要额外的换行。

例如:

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

或者,你可以使用 printf

$ printf 'input' | openssl base64
aW5wdXQ=
$
1
1
1
2010-03-17 04:24:21 +0000

有Perl plus 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
1
1
2016-04-18 22:13:21 +0000

如果你对一个字体文件进行base64编码,你可以这样做:

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

我在Mac(10.10)上一直使用这个方法。不会有行间距。

1
1
1
2010-03-17 00:00:24 +0000

recode应该能帮你解决

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

recode可通过MacPorts为OS X提供。

1
1
1
2019-07-08 16:00:26 +0000

跨平台解决方案

我们编译了一个跨平台的shell命令列表,将文件编码为base64。下面的命令是将一个输入文件(在例子中命名为deploy.key)转换为base64,不需要任何换行封装。

# 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(使用你选择的文件名)。

1
1
1
2015-03-27 13:09:24 +0000

一个简单的NodeJS版本:

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