12

base64エンコードを機能させ、bashスクリプトの変数に出力しようとしています。通常のCLI構文は次のとおりです。

echo -ne "\0myuser@myhost.com\0mypass" | base64

しかし、これをスクリプトの変数に入れようとすると、出力されますが、エンコーディングが非常に小さいため、機能していないことがわかります。スクリプト内の私のコードは次のとおりです。

auth=$(echo -ne "\0$user@$host\0$pass" | base64);

私はそれが引用符と関係があることを知っていますが、私はさまざまな引用符とシングルとバックスラッシュを使って無数のことを試してみました。

何かご意見は?

編集:情報のためにもう少し。これは、上記のuser / pass/hostで出力されます。

AG15dXNlckBteWhvc3QuY29tAG15cGFzcw==

しかし、スクリプトでは次のように出力されます。

LW5lIAo=
4

2 に答える 2

24

わかりました。レコードのために、これを回答として追加します。

問題は/bin/sh、デフォルトのインタプリタシェルとして持っていることでした。この場合はでしたdash

使用したテストスクリプト:

#!/bin/bash
user=myuser
pass=mypass
host=myhost.com

auth=$(echo -ne "\0$user@$host\0$pass" | base64);

echo $auth

結果:

[51][00:33:22] vlazarenko@alluminium (~/tests) > echo -ne "\0myuser@myhost.com\0mypass" | base64 
AG15dXNlckBteWhvc3QuY29tAG15cGFzcw== 

[52][00:33:42] vlazarenko@alluminium (~/tests) > bash base64.sh
AG15dXNlckBteWhvc3QuY29tAG15cGFzcw== 

[53][00:33:46] vlazarenko@alluminium (~/tests) > dash base64.sh  
LW5lIAo=
于 2012-09-05T22:34:41.623 に答える
7

echoプレーンな文字列以外のものを与えると、バージョンが異なれば動作も大きく異なります。コマンドオプションを解釈するもの(など-ne)もあれば、出力として出力するものもあります。文字列内のエスケープシーケンスを解釈するものもあれば(-eオプションが指定されていない場合でも)、解釈しないものもあります。

一貫した動作が必要な場合は、printf代わりに次を使用してください。

user=myuser
pass=mypass
host=myhost.com

auth=$(printf "\0%s@%s\0%s" "$user" "$host" "$pass" | base64)

ボーナスとして、パスワード(およびユーザー名とホスト)はフォーマット文字列ではなくプレーン文字列であるため、エスケープシーケンスを解釈しようとして混乱することはありません(実際のパスワードにはバックスラッシュが含まれていますか?)

于 2012-09-05T23:52:09.863 に答える