FileSystemException-尝试使用Java从Jetty删除文件时不允许执行操作

drnojrws  于 2023-01-29  发布在  Java
关注(0)|答案(1)|浏览(140)

当我尝试通过jetty删除debian中的文件时,我得到了一个FileSystemException。请注意,文件的所有者是mysql,因为在此操作之前我已经使用mysql完成了一个导出,并且该文件存在于debian中的**/tmp文件夹中。现在当我尝试使用Java删除该文件时,我得到了一个FileSystemException**,并说不允许操作。以下是我的代码。

String filePath = "tmp/test.csv";
                try {
                    Files.deleteIfExists(Paths.get(filePath));
                }  catch (IOException e) {
                    e.printStackTrace();
                }

这是堆栈跟踪。

java.nio.file.FileSystemException: /tmp/test.csv: Operation not permitted
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
    at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
    at sun.nio.fs.UnixFileSystemProvider.implDelete(UnixFileSystemProvider.java:244)
    at sun.nio.fs.AbstractFileSystemProvider.deleteIfExists(AbstractFileSystemProvider.java:108)
    at java.nio.file.Files.deleteIfExists(Files.java:1165)

我假设这个错误是由于文件的所有者是mysql。我还试图在删除文件之前将文件的所有者更改为jetty,但仍然以相同的错误结束。

Path path = Paths.get(filePath);
                UserPrincipalLookupService lookupService = FileSystems.getDefault().getUserPrincipalLookupService();
                UserPrincipal jetty = lookupService.lookupPrincipalByName("jetty");
                
                
                try {
                    Files.setOwner(path, jetty);
                }catch(FileSystemException fe) {
                    fe.printStackTrace();
                }

我还尝试了另一种方法,但再次结束了同样的错误。

Path path = Paths.get(filePath);
                FileOwnerAttributeView view = Files.getFileAttributeView(path, FileOwnerAttributeView.class);
                
                UserPrincipal hostUid = path.getFileSystem().getUserPrincipalLookupService().lookupPrincipalByName("jetty");
                try {
                    view.setOwner(hostUid);
                }catch(FileSystemException fe) {
                    fe.printStackTrace();
                }

我可以删除这个文件吗?任何帮助将不胜感激。
谢谢

s5a0g9ez

s5a0g9ez1#

正如@JoakimErdfelt在评论中提到的,问题是**/tmp文件夹中设置了sticky位**,这阻止了另一个用户删除文件(在本例中为jetty)。如果我使用chmod -t /tmp删除了sticky位,则可以删除文件。
更多详细信息请访问Why does Files.delete throw a FileSystemException
这里是Linux Sticky Bit Concept Explained with Examples

相关问题