【问题标题】:Java File.setLastModified() fails on Linux when you are not the file owner当您不是文件所有者时,Java File.setLastModified() 在 Linux 上失败
【发布时间】:2020-07-15 13:52:20
【问题描述】:

我有一个 java jar 文件,它使用 File.setLastModified() 通过引用 /mnt/nxx/file.name 来设置文件的特定时间戳。当文件由与运行 java 进程的登录用户相同的 UID 拥有时,它可以正常工作。但如果登录用户是任何其他 UID,它就会失败。

文件托管在外部 USB 驱动器上,该驱动器格式化为在引导时通过 /etc/fstab 安装在 Raspberry Pi 上的 Ext4 文件系统,使用:

/dev/sdb1 /mnt/nxx ext4 defaults 0 2

同一网络上的 Ubuntu 主机,在引导时通过 /etc/fstab 挂载同一磁盘,使用:

192.168.x.x:/mnt/nxx /mnt/nxx nfs rw 0 1

只要登录的用户与 Pi 上的 UID 相同,也可以成功设置时间戳。

但是,通过 Samba 连接到同一个磁盘(映射为 N:\ 到 \RASPI\root\mnt)并运行相同的 java 代码的 Windows-10 主机可以成功地为任何文件设置时间戳,而不管Pi 声明的文件所有者。

有问题的文件有 777 权限,正如预期的那样,我家庭网络中任何主机上的任何用户都可以成功修改该文件。唯一的问题是,当 Linux 主机上用户的 UID 与文件所有者不匹配时,对 setLastModified() 的 java 调用会失败——即使用户 java 进程正在使用与文件相同的 GID 运行。

我的目标是能够挂载磁盘并通过任何方法在我的家庭网络中的所有主机之间共享它,以便我家庭网络上的 Windows 和 Linux 主机都可以使用 java 代码成功地操纵时间-邮票。

为什么 Windows-10 可以不考虑用户而成功地操作时间戳,而 Linux 却不能?有没有办法让我在各种 fstab 挂载指令、smb.conf 或其他地方添加/配置选项来配置磁盘,以便 Linux 的行为与 Windows 相同?

顺便说一句:使用 NTFS 文件系统格式化的外部安装 HDD 也存在同样的问题。我没有尝试使用 NTFS 驱动器进行用户映射。

任何帮助将不胜感激。

顺时针

【问题讨论】:

    标签: java linux permissions file-ownership


    【解决方案1】:

    以下是针对遇到此问题的人的一些进一步信息,我相信即使潜在问题似乎仍然存在,这些信息也可以提供可行的解决方法。

    仅当 (1) 相关文件不属于正在运行的 java 进程的 UID 时,问题才会出现(注意:文件读/写权限不是这里的问题,重要的是文件所有权, ) 和 (2) 相关文件所在的磁盘卷安装在与文件所有者不同的 UID 下。在这些情况下,java 无法按预期设置 Last-Modified 时间。

    如果磁盘挂载为 CIFS 或使用与文件所有者匹配的 UID,则 java 可以成功管理时间戳。

    此外,此问题仅在 Linux 主机上出现。无论文件所有权或文件系统如何,Windows 主机似乎都不会出现此问题。

    【讨论】:

    猜你喜欢
    • 2013-04-18
    • 1970-01-01
    • 2015-04-18
    • 2013-01-28
    • 2012-07-08
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    • 2012-08-16
    相关资源
    最近更新 更多