【问题标题】:Extended file attributes and bash扩展文件属性和 bash
【发布时间】:2013-12-16 10:58:58
【问题描述】:

我在 Ubuntu bash 中遇到了一个我无法完全理解的有趣行为。 如果我将扩展文件属性添加到文件然后更改它 - 属性将从文件中删除。从我的角度来看,这是可以的。

user@user:~/tmp$ echo "aaa" > testattr
user@user:~/tmp$ setfattr --name "user.test" --value "Tested" testattr 
user@user:~/tmp$ getfattr --name "user.test" testattr
# file: testattr
user.test="Tested"
user@user:~/tmp$ vi testattr 
< change something in file and save it > 
user@user:~/tmp$ getfattr --name "user.test" testattr
testattr: user.test: No such attribute

但是,如果我使用 bash 在文件中写入内容 - 文件属性将保留在原处。 任何人都可以解释这种行为吗?

user@user:~/tmp$ echo "aaa" > testattr
user@user:~/tmp$ setfattr --name "user.test" --value "Tested" testattr 
user@user:~/tmp$ getfattr --name "user.test" testattr
# file: testattr
user.test="Tested"
user@user:~/tmp$ echo "bbb" > testattr
user@user:~/tmp$ getfattr --name "user.test" testattr
# file: testattr
user.test="Tested"

【问题讨论】:

    标签: linux bash ubuntu attr


    【解决方案1】:

    vi 正在删除已编辑的文件并将其替换为新文件。这就是为什么不保留属性的原因。

    这是对文件的操作日志。

    $ mkdir test
    $ touch test/file
    $ inotifywait -m -r test
    Setting up watches.  Beware: since -r was given, this may take a while!
    Watches established.
    # vi is now running in another shell
    test/ OPEN file
    test/ CREATE .file.swp
    test/ OPEN .file.swp
    test/ CREATE .file.swpx
    test/ OPEN .file.swpx
    test/ CLOSE_WRITE,CLOSE .file.swpx
    test/ DELETE .file.swpx
    test/ CLOSE_WRITE,CLOSE .file.swp
    test/ DELETE .file.swp
    test/ CREATE .file.swp
    test/ OPEN .file.swp
    test/ MODIFY .file.swp
    test/ ATTRIB .file.swp
    test/ CLOSE_NOWRITE,CLOSE file
    test/ OPEN file
    test/ CLOSE_NOWRITE,CLOSE file
    test/ MODIFY .file.swp
    test/ CREATE 4913
    test/ OPEN 4913
    test/ ATTRIB 4913
    test/ CLOSE_WRITE,CLOSE 4913
    test/ DELETE 4913
    test/ MOVED_FROM file     # old file moved
    test/ MOVED_TO file~
    test/ CREATE file         # new file created
    test/ OPEN file
    test/ MODIFY file
    test/ CLOSE_WRITE,CLOSE file
    test/ ATTRIB file
    test/ ATTRIB file
    test/ MODIFY .file.swp
    test/ DELETE file~
    test/ CLOSE_WRITE,CLOSE .file.swp
    test/ DELETE .file.swp
    

    请参阅this answer 以禁用该行为。

    【讨论】:

    • 感谢您的解释。实际上,我宁愿尝试弄清楚如果文件更改了如何删除属性=)
    • @PāvelsReško 您可以使用相同的inotify 库来检测修改过的文件并在其上删除属性。
    • @PāvelsReško 实际上bash 显示了最预期的行为,它更改文件内容而不删除和重新创建它。在这种情况下,vi 的行为不是预期的。
    • @Gregorz 据我所知 - Linux 中的功能是使用扩展文件属性实现的。因此,如果我向某种脚本添加功能,然后有人会更改该脚本 - 他可以使用我的功能。从我的角度来看,这不是很安全。
    • @Gregorz,如果文件被更改,实际上“security.capability”属性会从文件中删除。似乎是某种例外。
    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2021-03-11
    • 2018-07-08
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多