コマンドライン経由でbase64をエンコードする方法は?


216

Mac OS Xにファイルまたは標準入力をbase64でエンコードするターミナルコマンドはありますか?


5
base64エンコード構文はOSごとに一貫性がありますが、base64デコード構文はオペレーティングシステムのいずれかbase64 -dまたはbase64 -D依存していることに注意してください。OSXはを使用し-Dます。
クリスジョンソン

@ChrisJohnson OS X(10.10 Yosemite)のopensslデコード用フラグと組み合わせて使用​​する場合-d
ᴠɪɴᴄᴇɴᴛ

回答:


231

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でエンコードされた出力を改行せずにクリップボードにコピーします。
マティアスバイネンズ

3
-dフラグを使用してデコードします。
ケニー

5
Macでは、文字列をbase64エンコードするには:openssl base64 -e <<< ramおよびデコードするには:openssl base64 -d <<< cmFtCg==
Ram Patra

8
改行openssl base64 [-e] -Aが必要ない場合は、@ mathiasを使用します。+デコード時の@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を2回押す必要があります。そして、@Garretを注意してください:の有無にかかわらず、バッシュでopensslopenssl base64 <<< superuserかつopenssl base64 <<< "superuser" 誤って降伏c3VwZXJ1c2VyCg==「ここに文字列」として、その後、まだ改行が含まれています!(どうやら Bashだけでなく、zsh、ksh、yashでも見られhexdump <<< superuserます。Base64の結果はc3VwZXJ1c2Vy。になるはずです。)
Arjan

@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から通常に戻します。
ラッキードナルド

1
これは、1行を作成するため、SVGのエンコードに適しています。これはからの出力よりもきれいですopenssl base64。ありがとう!
シャニマル

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

または、コマンドを提供するBrew()を使用してインストールcoreutilsします。brew install coreutilsbase64

$ 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スイッチを使用して、RFC1521で指定されたbase64ごとにfile_in.txtをuuencode し、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
トーテル

5

macOSでは、私は常に以下を使用します。

echo -n "STRING" | base64

-nは、行末の改行文字を回避します。


3

Python

現在、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を省略すると、stdoutに出力されます。

base64

OSXとUbuntuの両方に存在する別のootbユーティリティ:

## 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

上記のSteve Follyの答えに加えて、stdinモードで暗号化する場合、余分な改行を渡さないようにするには、Ctrl + Dを2回押して、改行を追加せずに入力を終了します。出力は同じ行の直後に表示されます。

例えば:

$ 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!"

OSに付属しているopenssl(そして現在base64)ので、これがより良い答えだとは思わない
ジョシュ

髪を裂く危険性があります-そして、この批判は他のいくつかの回答にも当てはまることを知っています-この質問は、ファイルまたはstdinをエンコードする方法を尋ねました。間違っていない場合、あなたの答えは文字列のエンコード方法のみを示しています。
Gマン

1

再コーディングはあなたのためのトリックを行う必要があります

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

recodeはMacPortsを介してOS Xで利用可能です。


何も組み込まれていませんか?
ジョシュ

@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(選択したファイル名を使用)。

これらのコマンドは、プル要求の一部としてプロトタイプ化されたもので、クロスプラットフォームシェルコマンドでSSH秘密キーをbase64エンコードして改行を削除する必要がありました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.