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
$
ほとんどの場合、ただランダムゴミが帰ってきたようです。時々、このようにBase64デコーダは私に「間違った入力」を投げます。
この文字列は何ですか?元の入力値とはどのような関係がありますか?getfattr
私に与えられた値から元の入力値(åäöåä
この例など)にどのように戻りますか?
setfattr --version
私のシステムでは、応答はですsetfattr 2.4.46
。 Debian Wheezyパッケージのバージョンを実行しています。重要な場合は、既存のWheezyカーネルでZFS On Linux 0.6.3を実行しています(0.6.2でも同じ動作が発生しました)。
答え1
この質問を読んで少し気になっていくつかやってみましょう。「法医学」:
まず、反対のアプローチを試してみてください。
åäöåä
Base64はどのようにエンコードされますか?
$ echo åäöåä | base64
w6XDpMO2w6XDpAo=
これは明らかにあなたが持っているものと非常に似ているようです0sw6XDpMO2w6XDpA==
。0s
最初は追加の項目がたくさんありますが、最終的には合計されません。最後に改行文字を抑制するとåäöåä
(automaticとして挿入されるecho
)、次のような結果が得られます。
$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==
これがまさに先頭user.xdg.comment
を除いて -value です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が付けられます。
したがって、スクリプトを次のように変更します。
(文書コメント設定:)
#!/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
。