Как кодировать base64 через командную строку?
Есть ли в Mac OS X команда терминала, которая будет base64 кодировать файл или стандартный ввод?
20 ответов
openssl
может сделать это для вас, и все это установлено с OS X по умолчанию; нет необходимости устанавливать darwinports.
$ openssl base64 -in <infile> -out <outfile>
Без -in
опция читает из стандартного ввода
Openssl можно использовать более кратко:
echo -n 'input' | openssl base64
[echo -n -> необходимо использовать, иначе будет выполнено кодирование, включая символ новой строки]
или же
openssl base64 <ENTER> [type input] <CTRL+D>
Попробуйте использовать:
base64 -i <in-file> -o <outfile>
Это должно быть доступно по умолчанию на OS X.
В macOS я всегда использую:
echo -n "STRING" | base64
-n - избегать символа новой строки в конце строки.
base64
команда доступна по умолчанию на моем OS X 10.9.4.
Ты можешь использовать base64 <<< string
а также base64 -D <<< string
кодировать и декодировать строку в терминале, или base64 -in file
а также base64 -D -in file
кодировать и декодировать файл.
Поскольку 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
питон
В настоящее время 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
Вы также можете передать его прямо в буфер обмена (по крайней мере, на Mac):
openssl base64 -in [filename] | pbcopy
С точки зрения скорости, я бы использовал 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
В дополнение к ответу Стива Фолли, приведенному выше, при шифровании в режиме stdin, чтобы избежать пропуска дополнительных новых строк, дважды нажмите CTRL+D, чтобы завершить ввод без каких-либо дополнительных новых строк. Вывод будет показан сразу после той же строки.
Например:
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$
В качестве альтернативы, вы можете использовать printf
:
$ printf 'input' | openssl base64
aW5wdXQ=
$
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
Простая версия NodeJS:
node -e "process.stdout.write(new Buffer(process.argv[1]).toString('base64'))" "Hello world!"
По какой-то причине echo -n <data> | openssl base64
добавил новую строку в середине моих данных base64. Я предполагаю, что это потому, что мои данные base64 были очень длинными.
С помощью echo -n <data> | base64
кодировать и echo -n <base64-ed data> | base64 -D
чтобы декодировать работал нормально.
Есть 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 поверх исходного файла.
Перекодировать должен сделать трюк для вас
recode ../b64 < file.txt > file.b64
перекодировка доступна для OS X через MacPorts.
Если вы кодируете файл шрифта base64, вы можете сделать это:
base64 my-webfont.ttf > my-webfont.b64.ttf.txt
Я использую это на Mac (10.10) все время.
Примечание: разрывов строк не будет.
Кроссплатформенные решения
Мы составили список кроссплатформенных команд оболочки для кодирования файла как 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 для удаления новых строк.
Уже есть много отличных ответов, и мой делает в основном то же самое, за исключением того, что секрет никогда не отображается в терминале.
Я создал эти два псевдонима для кодирования строки из буфера обмена, и закодированная строка копируется в буфер обмена. То же самое касается и декодирования:
alias decode='pbpaste | base64 --decode | pbcopy'
alias encode='pbpaste | base64 | pbcopy'
На Mac вы можете просто кодировать и декодировать текущее содержимое буфера обмена в/из base64 с помощью:
- Кодируем в base64:
pbpaste | base64
- Декодирование из base64:
pbpaste | base64 --decode
вы можете сделать это:
echo -n "Hello, world" | base64
вы получите SGVsbG8sIHdvcmxk.