我编写了一个简短的 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 相同的行为)。
读这个问题我有点好奇,所以让我们做一些“取证”:
åäöåä
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
。
归档时间: |
|
查看次数: |
1069 次 |
最近记录: |