web-dev-qa-db-ja.com

setfattrによって設定されたこの一見base64データセットは何ですか?

フリーテキストコメントに対応する拡張属性を設定するために、setfattrを少し便利な形式で単純にラップする短いシェルスクリプトを作成しました。

#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -d -m '^user.xdg.comment$' "$1"

US ASCIIコメントをxattrsとして保存する場合、これはうまく機能します。ただし、US ASCII以外の文字を含むコメントを設定しようとすると、返されます。 Base64でエンコードされたデータのように見えるもの:

$ touch xyz
$ set-comment xyz åäöåä
# file: xyz
user.xdg.comment=0sw6XDpMO2w6XDpA==
$ 

しかし、それはBase64だけではありません。

$ printf "0sw6XDpMO2w6XDpA==" | \base64 --decode
��:\:L;l:\:@base64: invalid input
$ 

ほとんどの場合、私はjustランダムに見えるゴミを取り戻します。このように、Base64デコーダーが「無効な入力」を私に返すことがあります。

この文字列は何ですか?元の入力値との関係は何ですか? getfattrが元の入力値(この場合はåäöåäなど)に戻すにはどうすればよいですか?

私のシステムのsetfattr --versionsetfattr 2.4.46で応答します。 DebianWheezyによってパッケージ化されたバージョンを実行しています。万が一、問題が発生した場合は、標準のWheezyカーネルでZFS On Linux 0.6.3(0.6.2でも同じ動作が見られます)を実行しています。

4
a CVn

この質問を読んで少し興味があったので、いくつか「フォレンジック」を実行しましょう:

最初に反対を試みます:

åäöåäはBase64でどのようにエンコードされますか?

$ echo åäöåä | base64
w6XDpMO2w6XDpAo=

これは明らかにあなたが持っている0sw6XDpMO2w6XDpA==によく似ています。最初に余分な0sがあり、最後が完全に一致していません。 åäöåäの最後の改行を抑制すると(echoによって自動的に挿入されます)、次のようになります。

$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==

これは、開始時のuser.xdg.commentを除いて、まさに0s-値です。

結論

コメントBase64でエンコードされ、プレフィックスが0sになっています。他のいくつかの文字列をテストすると、これが確認されます。

例:

$ ./set-comment xyz 日本語
# file: xyz
user.xdg.comment=0s5pel5pys6Kqe

$ base64 -d <<<'5pel5pys6Kqe' ; echo
日本語

(ここで、; echoの出力は改行で終了しないため、base64は次のプロンプトを台無しにしません。)

ただし...

これは、これらの場合(コメントが非ASCIIの場合)、Base64でエンコードされ、プレフィックスが0sであることを示しています。

「本当の」答え

これを行った後、私はgetfattrのマンページをチェックするという素晴らしいアイデアを思いつきました、そしてそれはとりわけ次のように述べています:

オプションについて-e en, --encoding=en

値を取得した後、値をエンコードします。 enの有効な値は、「text」、「hex」、および「base64」です。テキスト文字列としてエンコードされた値は二重引用符( ")で囲まれ、16進数およびbase64としてエンコードされた文字列にはそれぞれ0xおよび0がプレフィックスとして付けられます。

したがって、スクリプトを次のように変更します。

(ファイルset-comment :)

#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -e text -d -m '^user.xdg.comment$' "$1"

常に属性をテキストとして出力し、次に例を示します。

$ ./set-comment xyz åäöåä   # with fixed script
# file: xyz
user.xdg.comment="åäöåä"

ただし、まだいくつかの注意点が残っています...次のように:

$ ./set-comment xyz 0x414243
# file: xyz
user.xdg.comment="ABC"

そして

$ ./set-comment xyz 0s5pel5pys6Kqe
# file: xyz
user.xdg.comment="日本語"

出力が入力と一致しない場合。

これらは、引数をsetfattrが好きな形式に「マッサージ」することで修正できます。 man setfattrを参照してください。

4
Johan E