web-dev-qa-db-ja.com

コマンドラインからbase64文字列をデコードするにはどうすればよいですか?

Base64文字列をデコードするbashスクリプトを書きたいです。たとえば、「decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==」と入力すると、Aladdin:open sesameと出力され、プロンプトに戻ります。

これまでpython -m base64 -d $1を含む単純なbashファイルを試しましたが、このコマンドは文字列ではなくファイル名を想定しています。追加のパッケージをインストールせずにこれを達成するためにコマンドラインから実行できる別の非対話型コマンド(Pythonモジュール内にある必要はありません)はありますか? (または、もし私がそうするなら、超最小の何か。)

414
david.libremone

coreutilsパッケージのbase64プログラムを使用するだけです。

echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode

または、改行文字を含める

echo `echo QWxhZGRpbjpvcGVuIHNlc2FtZQ== | base64 --decode`

出力(改行を含む):

Aladdin:open sesame
619
January

opensslはbase64をエンコードおよびデコードすることもできます

$ openssl enc -base64 <<< 'Hello, World!'
SGVsbG8sIFdvcmxkIQo=
$ openssl enc -base64 -d <<< SGVsbG8sIFdvcmxkIQo=
Hello, World!

編集:base64でエンコードされた文字列が複数の行で終わる例:

$ openssl enc -base64 <<< 'And if the data is a bit longer, the base64 encoded data will span multiple lines.'
QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
$ openssl enc -base64 -d << EOF
> QW5kIGlmIHRoZSBkYXRhIGlzIGEgYml0IGxvbmdlciwgdGhlIGJhc2U2NCBlbmNv
> ZGVkIGRhdGEgd2lsbCBzcGFuIG11bHRpcGxlIGxpbmVzLgo=
> EOF
And if the data is a bit longer, the base64 encoded data will span multiple lines.
92
geirha

どうぞ!

~/.bashrcファイルの下部に次を追加します。

decode () {
  echo "$1" | base64 -d ; echo
}

次に、新しいターミナルを開き、コマンドを実行します。

decode QWxhZGRpbjpvcGVuIHNlc2FtZQ==

これは、あなたがあなたの質問で要求したとおりに行います。

38
SirCharlo

元の依存関係を使用すると、元のスクリプトを少し変更するだけでこれを実行できます。

echo $1 | python -m base64 -d

ファイル名を渡さない場合、そのpythonモジュールは標準入力から読み取ります。最初のパラメーターをパイプで渡すには、echo $1 |を使用できます。

20
AmanicA

http://wiki.opensslfoundation.com/index.php?title=Command_Line_Utilities でbase64コマンドラインをコメントしました。そのため、openssl base64デコードを使用するときに警告を発行します。

 openssl base64 -e <<< 'Welcome to openssl wiki'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK



openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kK'

Welcome to openssl wiki

警告opensslのデフォルトでは、base64行の長さは64文字に制限されています。

 openssl base64 -e <<< 'Welcome to openssl wiki with a very long line
 that splits...'

 V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRo
 YXQgc3BsaXRzLi4uCg==

openssl base64 -d <<< 'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

=>何もない!

64文字を超える改行なしでbase64行をデコードできるようにするには、-Aオプションを使用します。

openssl base64 -d -A <<<
'V2VsY29tZSB0byBvcGVuc3NsIHdpa2kgd2l0aCBhIHZlcnkgbG9uZyBsaW5lIHRoYXQgc3BsaXRzLi4uCg=='

Welcome to openssl wiki with a very long line that splits...

とにかく、-AオプションはBUGGY(長いファイルの制限)であるため、実際にはbase64の結果を64文字の行に分割する方が適切です。

13
philippe lhardy

Perlを使用

Perl -MMIME::Base64 -ne 'printf "%s\n",decode_base64($_)' <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

またはpythonと同じ

python -m base64 -d <<< "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
4
A.B.

別の方法を追加するだけです:

emacs -Q --batch  -eval '(princ (base64-encode-string (read-string ": ")))'
2
erjoalgo