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


217

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


5
Имейте в виду , что , хотя base64 кодирующая синтаксис согласуется с одной ОС на другую, синтаксис base64-декодирование либо base64 -dили в base64 -Dзависимости от вашей операционной системы. OSX использует -D.
Крис Джонсон

@ChrisJohnson Если используется совместно с opensslфлагом для декодирования -dна OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Ответы:


232

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

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

Без -inопции читает из стандартного ввода


79
Используйте openssl base64 < path/to/file.png | tr -d '\n' | pbcopyили, cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopyчтобы пропустить запись в файл и просто скопировать вывод в кодировке base64 в буфер обмена без разрывов строк.
Матиас Биненс,

3
И используйте -dфлаг для декодирования.
Кенни

5
В Mac, чтобы Base64 кодировать строку: openssl base64 -e <<< ramи декодировать:openssl base64 -d <<< cmFtCg==
Рам Патра

8
@mathias, если вы не хотите, чтобы переводы строки openssl base64 [-e] -Aне делали . + @kenny при декодировании, если во вводе нет новой строки через каждые 76 символов, включая случай отсутствия новой строки, который я только что заявил, вам нужно, -d -Aили вы получите пропущенные или поврежденные данные без сообщения об ошибке (хотя есть ожидающий отчет об ошибке, который может привести к решению этой проблемы).
dave_thompson_085

2
@Ram, openssl base64 -e <<< ramфактически кодирует 4 байта, включая перевод строки в конце; см hexdump <<< ram.
Арджан

93

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

echo -n 'input' | openssl base64

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

или же

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

10
Однако решение "echo" добавляет символ LF (перевод строки) в конец строки ввода. Лучшее использование: echo -n 'input'
SuperTempel

8
И даже немного более краткимopenssl base64 <<< input
Гаррет Фогерли

2
Или просто использовать base64без openssl. В любом случае мне нужно дважды нажать Ctrl + D. И будьте осторожны, @Garret: в Bash, с или без openssl, openssl base64 <<< superuserи openssl base64 <<< "superuser" ошибочно возвращаются c3VwZXJ1c2VyCg==, поскольку «здесь строка» тогда все еще включает перевод строки! ( Очевидно, не только в Bash, но также в zsh, ksh и yash. См hexdump <<< superuser. Результат Base64 должен быть c3VwZXJ1c2Vy.)
Арджан

@Arjan Я бы не стал использовать слово «ошибочно» - как вы указали, здесь строка содержит перевод строки, но не зря - unix.stackexchange.com/questions/20157/… . echo -nявляется предпочтительным, если вам не нужен перевод строки. Это, безусловно, что-то, о чем нужно знать.
Стив Фолли

2
Вы можете использовать printfвместоecho -n
Джейсон S

50

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

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

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


1
Добавьте, --decodeчтобы полностью изменить процесс от base64 к нормальному.
luckydonald

1
Это лучше для кодирования SVG, потому что он создает одну строку. Это чище, чем на выходе openssl base64. Спасибо!
Shanimal

32

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

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


У вас есть пример? Я получаю Invalid characer in input streamпри использовании <<<... Я пытался с ", 'и ничего вокруг строки.
Джонас

@Jonas В какой ты скорлупе? Вы можете использовать это в bash и zsh.
WKPlus

Ах, неважно, это работает!
Джонас

8

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

6

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

echo -n "STRING" | base64

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


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

5

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

openssl base64 -in [filename] | pbcopy


гольф:base64 < [filename] | pbcopy
Тотелс

3

питон

В настоящее время Python предустановлен на всех Mac.

В терминале запустить 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)

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

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будет печатать на стандартный вывод.

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

2
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

2

По какой-то причине, 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

2

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

Например:

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

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

$ printf 'input' | openssl base64
aW5wdXQ=
$

1

Есть 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 поверх исходного файла.


1

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

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

Я не думаю, что это лучший ответ, поскольку openssl(и сейчас base64) идут с ОС.
Джош

С риском расщепления волос - и я знаю, что эта критика относится и к нескольким другим ответам - вопрос, заданный, как кодировать файл или стандартный ввод . Если я не ошибаюсь, ваш ответ показывает только, как кодировать строку.
G-Man

1

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

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

перекодировка доступна для OS X через MacPorts .


Там ничего не встроено?
Джош

@ Джош - есть - openssl
Стив Фолли

MacPorts не поставляется с любым дистрибутивом OS X. Есть много других вариантов, которые делают. Например, просто base64команда.
Джейсон С.

1

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

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

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

Примечание : не будет разрывов строк.


1

Кроссплатформенные решения

Мы составили список кроссплатформенных команд оболочки для кодирования файла как base64. Следующие команды принимают входной файл (названный deploy.keyв примерах) и преобразуют его в base64 без переноса новой строки. Вывод 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(используя выбранное вами имя файла).

Эти команды были созданы прототипом в рамках этого запроса на извлечение, в котором мы хотели, чтобы кроссплатформенные команды оболочки кодировали в base64 закрытый ключ SSH для удаления новых строк.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.