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

153306
Josh

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

169
Имейте в виду, что хотя синтаксис base64-кодирования в разных ОС одинаков, синтаксис декодирования base64 может быть либо base64 -d, либо base64 -D в зависимости от вашей операционной системы. OSX использует `-D`. Chris Johnson 11 лет назад 4
@ChrisJohnson Если используется вместе с `openssl`, флаг для декодирования -` -d` на OS X (10.10 Yosemite). ᴠɪɴᴄᴇɴᴛ 8 лет назад 0

16 ответов на вопрос

186
Steve Folly

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

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

Без -inопции читает из stdin

Используйте `openssl base64 <path / to / file.png | tr -d '\ n' | pbcopy` или `cat path / to / file.png | openssl base64 | tr -d '\ n' | pbcopy`, чтобы пропустить запись в файл и просто скопировать вывод в кодировке base64 в буфер обмена без разрывов строк. Mathias Bynens 13 лет назад 69
И используйте флаг `-d` для декодирования. kenny 10 лет назад 1
В Mac, чтобы Base64 кодировал строку: `openssl base64 -e <<< ram` и декодировал:` openssl base64 -d <<< cmFtCg == ` Ram Patra 9 лет назад 5
Есть ли возможность вывести строку в кодировке base64 в терминале? think123 9 лет назад 0
не берите в голову, я нашел это: `openssl base64 <путь / к / файлу` должен работать отлично. think123 9 лет назад 0
@mathias, если вы не хотите переводить строки, openssl base64 [-e] -A` делает это. + @kenny при декодировании, если во вводе нет новой строки каждые 76 символов, в том числе и в случае отсутствия новой строки, о котором я только что говорил, вам нужно `-d -A`, иначе вы получите отсутствующие или поврежденные данные * без сообщения об ошибке * ( хотя есть ожидающий отчет об ошибке, который может привести к исправлению). dave_thompson_085 8 лет назад 6
@Ram, `openssl base64 -e <<< ram` фактически кодирует 4 байта, включая перевод строки в конце; см. «hexdump <<< ram». Arjan 8 лет назад 2
Я должен был использовать -D вместо строчной -D kendepelchin 6 лет назад 0
67
Glen

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

echo -n 'input' | openssl base64 

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

или же

openssl base64 <ENTER> [type input] <CTRL+D> 
Однако решение "echo" добавляет символ LF (перевод строки) в конец строки ввода. Лучшее использование: echo -n 'input' SuperTempel 11 лет назад 9
И даже более краткий `openssl base64 <<< input` Garrett Fogerlie 10 лет назад 6
Или просто используйте `base64` без` openssl`. В любом случае мне нужно дважды нажать Ctrl + D. И будьте осторожны, @Garret: в Bash, с или без `openssl`,` openssl base64 <<< superuser` и `openssl base64 <<<" superuser "` ** ошибочно ** выдают `c3VwZXJ1c2VyCg ==`, как " здесь строка "тогда еще включает перевод строки! ([Очевидно] (https://lists.gnu.org/archive/html/bug-bash/2015-02/msg00096.html) не только в Bash, но также в zsh, ksh и yash. Смотрите `hexdump << <superuser`. Результат Base64 должен быть `c3VwZXJ1c2Vy`.) Arjan 8 лет назад 2
@Arjan Я бы не стал использовать слово «ошибочно» - как вы указали, здесь строка содержит перевод строки, но не без причины - http://unix.stackexchange.com/questions/20157/why-does -a-bash-here-string-add-a-trailing-newline-char. `echo -n` предпочтительнее, если вам не нужен перевод строки. Это, безусловно, что-то, о чем нужно знать. Steve Folly 8 лет назад 0
@ Стив, действительно, виноваты не `openssl base64` и не Bash. Но это, конечно, не ожидаемый результат при кодировании слова `input`, поэтому я хотел убедиться, что" ошибочно "увидят будущие читатели ;-) Arjan 8 лет назад 0
Вы можете использовать `printf` вместо` echo -n` Jason S 7 лет назад 2
34
Derreck Dean

Try using:

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

It should be available by default on OS X.

Отлично. просто и элегантно Спасибо! Leon li 6 лет назад 1
Добавьте `--decode`, чтобы перевернуть процесс с base64 на обычный. luckydonald 5 лет назад 0
24
WKPlus

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

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

Do you have an example? I get `Invalid characer in input stream` when using `<<<`...I have tried with `"`, `'` and nothing around the string. Jonas 7 лет назад 0
@Jonas В какой ты скорлупе? Вы можете использовать это в bash и zsh. WKPlus 7 лет назад 0
Ах, неважно, это работает! Jonas 7 лет назад 0
6
kenorb

Поскольку 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 
5
phiz

In terms of speed, I would use openssl followed by perl, followed by uuencode. In terms of portability, I would use uuencode followed by Perl followed by openssl (If you care about reusing the code on as many other UNIX like stock platforms as possible). Be careful though because not all UNIX variants support the -m switch (iirc AIX does, HP/UX does, Solaris doesn't).

$ time perl -MMIME::Base64 -e 'undef $/;while(<>)' \ > 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 

Use the -m switch to uuencode file_in.txt per base64 as specified by RFC1521 and write it to filename.b64 (with filename_when_uudecoded.txt as the default filename when decoded):

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

STDIN example:

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

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

openssl base64 -in [filename] | pbcopy

golfing: `base64 < [filename] | pbcopy` totels 7 лет назад 0
2
user214207
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 7 лет назад 0
2
ccpizza

Python

Python comes preinstalled on all macs nowadays.

In Terminal run python (or ipython).

Encode a file:

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

Decode a file:

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

Of course, both operations can be converted to a oneliner but this way it is more readable.

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 

Omitting the -out/-output... filename will print to stdout.

base64

Another ootb utility present both in OSX and 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 
2
Heath Borders

For some reason, echo -n <data> | openssl base64 added a newline in the middle of my base64 data. I assume it was because my base64 data was really long.

Using echo -n <data> | base64 to encode and echo -n <base64-ed data> | base64 -D to decode worked fine.

nb: на моем nix мне пришлось использовать -d echo -n c29tZXVzZXI6c29tZXBhc3N3b3Jk | base64 -d someuser: somepassword mlo55 8 лет назад 0