gpt4 book ai didi

java - `touch` 在 Linux 上使用 ACL 的文件导致 "Operation not permitted"

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:15:29 24 4
gpt4 key购买 nike

在 Java 代码中,我想“触摸”一个文件。我想将时间戳更新为当前时间。该文件使用 ACL。这似乎是问题所在。

文件:

$ ll file.xml 
-rw-rwxrw-+ 1 root root 8611 Oct 4 17:28 file.xml
$ getfacl file.xml
# file: file.xml
# owner: root
# group: root
user::rw-
user:tomcat8:rwx
group::r-x
mask::rwx
other::rw-

我的 Java 应用程序从 Tomcat 8 运行,用户为 tomcat8。 sudo -u tomcat8 touch file.xml 有效。如果我完全删除 ACL 并将 tomcat8 设置为所有者,它也会起作用。但这在生产环境中是不可能的。

所以一开始我尝试了 Apache common-io:

FileUtils.touch(path);

这会导致 IOException。我对其进行了更多调试,发现库调用了 FileSystem.setLastModifiedTime,它调用了 Linux 函数 utimes

我调试了 Linux touch 命令,发现它调用了另一个更现代的函数:utimensat(0, NULL, NULL, 0)。它还调用 dup2 并复制文件描述符。

所以我用 Java 构建了自己的触摸方法:

long time = System.currentTimeMillis();
FileTime fileTimeNow = FileTime.fromMillis(time);
BasicFileAttributeView fileAttributeView = Files.getFileAttributeView(derivative.toPath(), BasicFileAttributeView.class);
fileAttributeView.setTimes(fileTimeNow, fileTimeNow, fileTimeNow);

这也会抛出异常(不允许操作)。

它在内部调用 utimensat(69, NULL, [{1538666780, 483000000}, {1538666780, 483000000}], 0)

我无法在 .setTimes(...) 上设置 null。此调用将被忽略。并且没有 Java 方法来复制文件描述符 (dup2)。所以我无法测试进一步的步骤来使它更像 Linux 的触摸。

当文件使用 ACL 时如何使它工作?我不想运行外部程序(触摸)。

最佳答案

如果文件不是并发写入的,您可以打开它,读取它的第一个字节,然后在偏移量零处再次写回。这将更新文件的修改时间而不需要所有权权限。

(顺便说一句,ACL 看起来很奇怪,尤其是 other::rw- 部分。)

关于java - `touch` 在 Linux 上使用 ACL 的文件导致 "Operation not permitted",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52651123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com