在Mac OS X中是否存在一个将对文件或stdin进行base64编码的终端命令?

评论

请注意,尽管从一个操作系统到另一个操作系统,base64-encoding语法是一致的,但根据您的操作系统,base64-decoding语法是base64 -d或base64 -D。 OSX使用-D。

@ChrisJohnson如果与openssl配合使用,则在OS X(10.10 Yosemite)上,解码标志为-d。

#1 楼

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

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


而无需从qdin中读取-in选项

评论


使用openssl base64
–马蒂亚斯·拜恩斯(Mathias Bynens)
2011-4-12 13:07



并使用-d标志进行解码。

–肯尼
2013年12月11日在22:26



在mac中,要对base64编码一个字符串:openssl base64 -e <<< ram并进行解码:openssl base64 -d <<< cmFtCg ==

–Ram Patra
2014年11月13日10:52



@mathias,如果您不希望换行,则openssl base64 [-e] -A这样做。 + @kenny进行解码,如果输入最多每76个字符没有换行符,包括我刚刚说过的无换行符情况,则需要-d -A,否则将丢失或损坏数据而没有错误消息(尽管有一个待处理的错误报告,可能会对此进行修复)。

–dave_thompson_085
2015年5月27日14:54



@Ram,openssl base64 -e <<< ram实际上编​​码4个字节,包括尾随的换行符;参见hexdump <<< ram。

– Arjan
15年6月3日在20:39

#2 楼

可以更简洁地使用Openssl:

echo -n 'input' | openssl base64


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



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


评论


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

– SuperTempel
2012年7月17日15:17



甚至更简洁的openssl base64 <<<输入

–加里特·佛格利(Garrett Fogerlie)
2013年6月6日在16:57

或者只使用没有openssl的base64。无论哪种方式,我都需要按两次Ctrl + D。提防@Garret:在Bash中,无论是否带有openssl,openssl base64 <<<超级用户,openssl base64 <<<“超级用户”都会错误地产生c3VwZXJ1c2VyCg ==,因为“此处的字符串”仍然包含换行符! (显然,不仅在Bash中,而且在zsh,ksh和yash中也是如此。请参见hexdump <<<超级用户。Base64结果应为c3VwZXJ1c2Vy。)

– Arjan
15年6月3日在20:37

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

–史蒂夫·弗利(Steve Folly)
2015年6月5日7:33

您可以使用printf代替echo -n

–Jason S
16-09-5在6:08



#3 楼

尝试使用:

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


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

评论


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

–luckydonald
18年2月2日在14:05

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

–假名
19年4月18日在1:35

#4 楼

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

可以在终端中使用base64 <<< stringbase64 -D <<< string编码和解码字符串,或者使用base64 -in filebase64 -D -in file编码和解码文件。 br />

评论


你有例子吗?使用<<< ...时,输入流中出现无效字符。

–乔纳斯(Jonas)
16-09-20在11:46

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

– WKPlus
16-09-21在12:42

啊,没关系,它有效!

–乔纳斯(Jonas)
16-09-22在8:46

请注意,base64 <<< cat等同于echo cat | base64,而不是echo -n cat | base64。基本上,自动换行将被添加到base64编码的字符串中,而这可能不是您想要的。

– Bill
20-4-12的3:29

#5 楼

在macOS上,我始终使用:

echo -n "STRING" | base64

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

评论


如果您正在运行Cmder,这在Windows上也适用。

–craftworkgames
20 May 27'2:03

#6 楼

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

$ 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


#7 楼

在速度方面,我将使用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开关,以RFC1521指定的base64为单位uuencode file_in.txt并将其写入filename.b64(当filename_when_uudecoded.txt为默认文件名时,解码):

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


#8 楼

您还可以将其直接传送到剪贴板(至少在Mac上为):

openssl base64 -in [filename] | pbcopy

评论


打高尔夫球:base64 <[文件名] | pbcopy

–电话
16年8月11日在19:57

#9 楼

Python

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

在Terminal运行python(或ipython)。

编码文件:

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


对文件进行解码:更具可读性。

OpenSSL

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


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

base64

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

## 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


#10 楼

uuencode -m [-o output_file] [file] 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
16年11月17日在7:27

#11 楼

由于某种原因,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-4-14的0:07



#12 楼

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

例如: />
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$


#13 楼

有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编码的输出写到原始文件上。

#14 楼

一个简单的NodeJS版本:

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


评论


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

–乔什
15年3月27日在15:01

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

– G-Man说“恢复莫妮卡”
2015年3月27日19:00

#15 楼

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

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


可通过MacPorts在OS X上使用重新编码。

评论


没有内置的东西吗?

–乔什
10 Mar 17 '10 at 0:24

@Josh-有-openssl

–史蒂夫·弗利(Steve Folly)
10 Mar 17 '10 at 0:25

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

–Jason S
2016年9月5日下午6:05

#16 楼

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

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


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

注意:没有换行符。

#17 楼

跨平台解决方案

我们编译了一系列跨平台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私钥进行编码以删除换行符。