setfattr 设置的这个看似 base64 的数据是什么?

use*_*ser 5 base64 xattr

我编写了一个简短的 shell 脚本,它只setfattr是以稍微方便的形式包装,用于设置与自由文本注释相对应的扩展属性:

#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -d -m '^user.xdg.comment$' "$1"
Run Code Online (Sandbox Code Playgroud)

将 US ASCII 注释存储为 xattrs,这很有效。但是,如果我尝试设置包含非 US ASCII 字符的注释,它会返回似乎是 Base64 编码的数据:

$ touch xyz
$ set-comment xyz åäöåä
# file: xyz
user.xdg.comment=0sw6XDpMO2w6XDpA==
$ 
Run Code Online (Sandbox Code Playgroud)

但这不仅仅是 Base64:

$ printf "0sw6XDpMO2w6XDpA==" | \base64 --decode
??:\:L;l:\:@base64: invalid input
$ 
Run Code Online (Sandbox Code Playgroud)

大多数时候,我得到的只是看起来随机的垃圾。有时,像这样,Base64 解码器会向我抛出“无效输入”。

这个字符串是什么?它与原始输入值的关系是什么?我如何从什么getfattr给我回到原始输入值(例如åäöåä在这种情况下)?

setfattr --version在我的系统上以setfattr 2.4.46. 我正在运行 Debian Wheezy 打包的版本。在不太可能发生的情况下,我在库存 Wheezy 内核上运行 ZFS On Linux 0.6.3(也看到了与 0.6.2 相同的行为)。

Joh*_*n E 5

读这个问题我有点好奇,所以让我们做一些“取证”

首先尝试相反的方法:

åäöåäBase64是如何编码的?

$ echo åäöåä | base64
w6XDpMO2w6XDpAo=
Run Code Online (Sandbox Code Playgroud)

这显然很像0sw6XDpMO2w6XDpA==你所拥有的。0s开头有一个额外的,结尾不完全匹配。抑制末尾的换行符åäöåä(由 自动插入echo),我们得到:

$ echo -n åäöåä | base64
w6XDpMO2w6XDpA==
Run Code Online (Sandbox Code Playgroud)

这正是 -user.xdg.comment值,除了0s开头。

结论

注释Base64 编码的并以 为前缀0s,测试其他一些字符串证实了这一点。

例子:

$ ./set-comment xyz ???
# file: xyz
user.xdg.comment=0s5pel5pys6Kqe

$ base64 -d <<<'5pel5pys6Kqe' ; echo
???
Run Code Online (Sandbox Code Playgroud)

; echo因为 的输出base64不会以换行符结尾,所以不要弄乱下一个提示。)

然而...

这只是表明在这些情况下(注释是非 ASCII 的),它以 Base64 编码并以0s.

“真实”的答案

这样做之后,我得到了检查手册页的绝妙想法getfattr,其中提到:

关于选项 -e en, --encoding=en

检索值后对其进行编码。en 的有效值为“text”、“hex”和“base64”。编码为文本字符串的值用双引号 (") 括起来,而编码为十六进制和 base64 的字符串分别以 0x 和 0 为前缀。

因此,将您的脚本更改为:

(文件集评论:)

#!/bin/sh
test "$2" && setfattr -n user.xdg.comment -v "$2" "$1"
getfattr -e text -d -m '^user.xdg.comment$' "$1"
Run Code Online (Sandbox Code Playgroud)

将始终将属性打印为文本,例如:

$ ./set-comment xyz åäöåä   # with fixed script
# file: xyz
user.xdg.comment="åäöåä"
Run Code Online (Sandbox Code Playgroud)

但是,仍然有一些警告......例如:

$ ./set-comment xyz 0x414243
# file: xyz
user.xdg.comment="ABC"
Run Code Online (Sandbox Code Playgroud)

$ ./set-comment xyz 0s5pel5pys6Kqe
# file: xyz
user.xdg.comment="???"
Run Code Online (Sandbox Code Playgroud)

输出与输入不匹配的地方。

这些可以通过将论点“​​按摩”成setfattr喜欢的形式来解决。见man setfattr