Как кодировать base64 через командную строку?
Есть ли в Mac OS X терминальная команда, которая будет кодировать base64 файл или stdin?
Есть ли в Mac OS X терминальная команда, которая будет кодировать base64 файл или stdin?
openssl
может сделать это за вас, и все это установлено с OS X по умолчанию; нет необходимости устанавливать darwinports.
$ openssl base64 -in <infile> -out <outfile>
Без опции -in
читает из stdin
Попробуйте использовать:
base64 -i <in-file> -o <outfile>
Он должен быть доступен по умолчанию в OS X.
Поскольку по умолчанию Python поставляется с операционной системой 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
```.
С точки зрения скорости, я бы использовал 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
```.
Python предустановлен на всех макросах.
В терминале запущен 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, но таким образом, это более читабельно.
## 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.
Еще одна утилита 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
```.
Почему-то echo -n <data> | openssl base64
добавил новую строку в середине моих базовых64 данных. Полагаю, это связано с тем, что мои базовые64 данные были очень длинными.
Использование echo -n <data> | base64
для кодирования и echo -n <base64-ed data> | base64 -D
для декодирования работало нормально.
uuencode -m [-o output_file] [file] name
Где name - имя для отображения в закодированном заголовке.
Пример:
или
cat docbook-xsl.css | uuencode -m docbook-xsl.css
В дополнение к ответу Стива Фолли, приведенному выше, при шифровании в режиме stdin, чтобы избежать прохождения дополнительных новых строк, нажмите CTRL+D дважды, чтобы закончить ввод без дополнительных новых строк. На выходе будет отображаться сразу после той же строки.
Например:
$ openssl base64 [Enter]
input<CTRL+D><CTRL+D>aW5wdXQ=
$
Альтернативно можно использовать printf
:
$ printf 'input' | openssl base64
aW5wdXQ=
$
Есть 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 поверх оригинального файла.
Мы скомпилировали список кросс-платформенных команд оболочки для кодирования файла в виде base64. Следующие команды берут входной файл (в примерах с именем deploy.key
) и преобразовывают его в base64 без обёртывания newline. Вывод base64 выводится на терминал через stdout.
# 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
(используя имя файла по вашему выбору).
Эти команды были прототипированы как часть этого pull request , где мы хотели, чтобы кроссплатформенные команды оболочки для base64 кодировали SSH приватный ключ для удаления новых строк.