Как кодировать base64 через командную строку?

Есть ли команда терминала в Mac OS X, которая будет base64 кодировать файл или stdin?

150 голосов | спросил Josh 17 MaramWed, 17 Mar 2010 02:15:37 +03002010-03-17T02:15:37+03:0002 2010, 02:15:37

16 ответов


170

openssl может сделать это для вас, и все это установлено с OS X по умолчанию; нет необходимости устанавливать darwinports.

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

Без опции -in считывается из stdin

ответил Steve Folly 17 MaramWed, 17 Mar 2010 03:25:08 +03002010-03-17T03:25:08+03:0003 2010, 03:25:08
59

Openssl можно использовать более лаконично:

echo -n 'input' | openssl base64

[echo -n -> должен использоваться, или будет выполнена кодировка, включая новый символ строки]

или

openssl base64 <ENTER> [type input] <CTRL+D>
ответил Glen 21 AMpWed, 21 Apr 2010 10:12:44 +040012Wednesday 2010, 10:12:44
30

Попробуйте использовать:

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

Он должен быть доступен по умолчанию для OS X.

ответил Derreck Dean 27 FebruaryEurope/MoscowbFri, 27 Feb 2015 23:13:36 +0300000000pmFri, 27 Feb 2015 23:13:36 +030015 2015, 23:13:36
20

base64 по умолчанию доступна в моей OS X 10.9.4.

Вы можете использовать base64 <<< string и base64 -D <<< string для кодирования и декодирования строки в терминале или base64 -in file и base64 -D -in file для кодирования и декодирования файла.

ответил WKPlus 17 MaramThu, 17 Mar 2016 05:48:49 +03002016-03-17T05:48:49+03:0005 2016, 05:48:49
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 file_in.txt для base64, как указано RFC1521 и напишите его в 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
ответил phiz 5 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 05 Sep 2012 11:43:32 +0400 2012, 11:43:32
5

Так как Python предоставляется OS X по умолчанию, вы можете использовать его, как показано ниже:

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

Или установите coreutils через Brew (brew install coreutils), который предоставит команду base64:

$ echo FOO | base64
Rk9PCg==
$ echo Rk9PCg== | base64 -d
FOO
ответил kenorb 25 Maypm15 2015, 20:19:49
3

Вы также можете передать его прямо в буфер обмена (по крайней мере, на Mac):

openssl base64 -in [filename] | pbcopy

ответил Steve 12 J000000Tuesday16 2016, 18:39:22
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
ответил user214207 5 AMpFri, 05 Apr 2013 00:12:06 +040012Friday 2013, 00:12:06
2

По какой-то причине echo -n <data> | openssl base64 добавил новую строку в середине моих данных base64. Я предполагаю, что это было потому, что мои данные base64 были действительно длинными.

Использование echo -n <data> | base64 для кодирования и echo -n <base64-ed data> | base64 -D для декодирования отлично работает.

ответил Heath Borders 27 J000000Sunday14 2014, 09:16:22
1

Существует 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

Это возвращает файл1 к файлу file1.txt и записывает исходный файл с кодировкой Base-64.

ответил Jonathan Leffler 17 MaramWed, 17 Mar 2010 07:24:21 +03002010-03-17T07:24:21+03:0007 2010, 07:24:21
1

Простая версия NodeJS:

node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
ответил mauvm 27 MarpmFri, 27 Mar 2015 16:09:24 +03002015-03-27T16:09:24+03:0004 2015, 16:09:24
1

recode должен сделать трюк для вас

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

recode доступен для OS X через MacPorts .

ответил heavyd 17 MaramWed, 17 Mar 2010 03:00:24 +03002010-03-17T03:00:24+03:0003 2010, 03:00:24
1

Если вы кодируете base64 файл шрифта, вы можете сделать это:

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

Я использую это на Mac (10.10) все время.

Примечание . Не будет строк.

ответил Chuck Ugwuh 19 AMpTue, 19 Apr 2016 01:13:21 +030013Tuesday 2016, 01:13:21
1

В дополнение к вышеприведенному ответу Стива Фолли, когда вы шифруете в режиме stdin, чтобы не пропускать дополнительные строки, нажмите CTRL + D дважды, чтобы завершить ввод без каких-либо дополнительных строк. Выход будет отображаться сразу после той же строки.

Например:

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

В качестве альтернативы вы можете использовать printf:

$ printf 'input' | openssl base64
aW5wdXQ=
$
ответил bigT 27 J000000Wednesday16 2016, 21:14:32
1

Python

В настоящее время Python поставляется с предустановленными всеми маками.

В Terminal run 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)

Конечно, обе операции могут быть преобразованы в oneliner, но таким образом это более читаемо.

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 будет напечатано на stdout.

base64

Другая утилита ootb присутствует как в OSX, так и в Ubuntu:

## 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
ответил ccpizza 17 J0000006Europe/Moscow 2014, 14:00:25
0

В macOS я всегда использую:

echo -n "STRING" | base64

-n следует избегать появления нового символа линии в конце строки.

ответил patrickS 1 AM00000080000000031 2017, 08:33:00

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132