Як кодувати base64 за допомогою командного рядка?


215

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


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

@ChrisJohnson Якщо використовується разом з opensslпрапором для розшифровки, він знаходиться -dна OS X (10.10 Yosemite).
ᴠɪɴᴄᴇɴᴛ

Відповіді:


229

opensslможе це зробити для вас, і все це встановлено з OS X за замовчуванням; не потрібно встановлювати darwinports.

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

Без -inваріанту читає з stdin


79
Використовуйте openssl base64 < path/to/file.png | tr -d '\n' | pbcopyабо cat path/to/file.png | openssl base64 | tr -d '\n' | pbcopyпропустіть запис у файл і просто скопіюйте вихідний код, кодований base64, у буфер обміну без розривів рядків.
Mathias Bynens

3
І використовувати -dпрапор для декодування.
kenny

5
У mac, to base64 кодує рядок: openssl base64 -e <<< ramа для декодування:openssl base64 -d <<< cmFtCg==
Ram Patra

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==, оскільки "тут рядок" все ще включає стрічку каналу! ( Мабуть, не тільки в Баші, але і в зш, кш і яш. Дивіться hexdump <<< superuser. Результат Base64 повинен бути c3VwZXJ1c2Vy.)
Арджан

@Arjan Я б вагався з використанням слова "помилково" - як ви вказали, сюди-рядок містить канал рядків, але з поважної причини - unix.stackexchange.com/questions/20157/… . echo -nє кращим, якщо вам не потрібен новий рядок. Це, безумовно, щось слід пам’ятати.
Стів Фоллі

2
Ви можете використовувати printfзамістьecho -n
Jason S

50

Спробуйте скористатися:

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

Він повинен бути доступний за замовчуванням в ОС X.


1
Додати, --decodeщоб змінити процес від base64 до звичайного.
luckydonald

1
Це краще для кодування для SVG, оскільки він створює один рядок. Це чистіше, ніж вихід з openssl base64. Дякую!
Шанімал

32

base64 команда доступна за замовчуванням на моїй ОС 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

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 (з ім'ям файлу_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
totels

5

У macOS я завжди використовую:

echo -n "STRING" | base64

-n - уникати нового символу рядка на кінці рядка.


3

Пітон

Сьогодні Python встановлений на всіх комп’ютерах.

У Terminal run 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буде надруковано для stdout.

база64

Ще одна утиліта 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 додали новий рядок. Я припускаю, що це було тому, що мої бази даних64 були дуже довгими.

Використання 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) йде з ОС.
Джош

Загрожуючи розщеплення волосся - і, я знаю, що ця критика стосується і пари інших відповідей, - питання, яке задають, як кодувати файл або stdin . Якщо я не помиляюся, у вашій відповіді показано лише те, як кодувати рядок.
G-Man

1

recode повинен зробити трюк для вас

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

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


Нічого не вбудовано?
Джош

@Josh - є - openssl
Стів Фоллі

MacPorts не постачається з будь-яким дистрибутивом OS X. Є багато інших варіантів, які можна зробити. Наприклад, просто base64команда.
Джейсон S

1

Якщо ви кодуєте шрифтовий файл base64, ви можете це зробити:

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

Я використовую це на Mac (10.10) весь час.

Примітка : Розривів рядків не буде.


1

Крос-платформні рішення

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

Ці команди були прототиповані як частина цього запиту на витяг, де ми хотіли, щоб команди команд оболонки міжплатформних платформ base64 кодували приватний ключ SSH для видалення нових рядків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.