フリーテキストコメントに対応する拡張属性を設定するために、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 --version
はsetfattr 2.4.46
で応答します。 DebianWheezyによってパッケージ化されたバージョンを実行しています。万が一、問題が発生した場合は、標準のWheezyカーネルでZFS On Linux 0.6.3(0.6.2でも同じ動作が見られます)を実行しています。
この質問を読んで少し興味があったので、いくつか「フォレンジック」を実行しましょう:
åäöåä
は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
を参照してください。