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


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


155
2018-03-16 23:15


происхождения


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


ответы:


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

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

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


175
2018-03-17 00:25



использование openssl base64 < path/to/file.png | tr -d '\n' | pbcopy или cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopy пропустить запись в файл и просто скопировать вывод с кодировкой base64 в буфер обмена без разрывов строк. - Mathias Bynens
И используйте -d флаг для декодирования. - kenny
В mac, to base64 закодировать строку: openssl base64 -e <<< ram и для декодирования: openssl base64 -d <<< cmFtCg== - Ram Patra
@mathias, если вы не хотите новых строк openssl base64 [-e] -A делает это. + @kenny на декодировании, если вход не имеет новой строки каждые 76 символов максимум, включая случай без новых строк, который я только что заявил, вам нужно -d -A или вы получите отсутствующие или поврежденные данные без сообщения об ошибке (хотя есть ожидающий отчета об ошибке, который может привести к исправлению). - dave_thompson_085
@ОЗУ, openssl base64 -e <<< ram на самом деле кодирует 4 байта, включая кортеж задней линии; видеть hexdump <<< ram, - Arjan


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

echo -n 'input' | openssl base64

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

или

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

60
2018-04-21 06:12



Однако решение «эхо» добавляет символ LF (строка строки) к концу входной строки. Лучше использовать: echo -n 'input' - SuperTempel
И даже немного более кратким openssl base64 <<< input - Garrett Fogerlie
Или просто используйте base64 без openssl, В любом случае, мне нужно дважды нажать Ctrl + D. И будьте осторожны, @Garret: в Bash, с или без openssl, openssl base64 <<< superuser а также openssl base64 <<< "superuser"  ошибочно Уступать c3VwZXJ1c2VyCg==, так как «здесь строка» по-прежнему включает в себя фид! (По всей видимости не только в Bash, но и в zsh, ksh и yash. Видеть hexdump <<< superuser, Результат Base64 должен быть c3VwZXJ1c2Vy.) - Arjan
@Arjan Я бы с сомнением использовал слово «ошибочно» - как вы указали, здесь-строка включает в себя фид строки, но не зря - unix.stackexchange.com/questions/20157/... , echo -n если вам не нужна новая линия. Это, безусловно, нужно знать. - Steve Folly
Вы можете использовать printf на месте echo -n - Jason S


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

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

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


31
2018-02-27 20:13



Отлично. простой и элегантный. Благодаря! - Leon li


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

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


21
2018-03-17 02:48



У вас есть пример? я получил Invalid characer in input stream когда используешь <<<... Я пробовал с ", ' и ничего вокруг строки. - Jonas
@Jonas Какая у вас оболочка? Вы можете использовать это в bash и zsh. - WKPlus
Ах, неважно, все работает! - Jonas


Что касается скорости, я бы использовал 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

5
2017-09-05 07:43





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

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

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

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

5
2018-05-25 17:19





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

openssl base64 -in [filename] | pbcopy


4
2017-07-12 15:39



игра в гольф: base64 < [filename] | pbcopy - totels