Java应用程序是否有获得root权限的方法?

Lam*_*bda 16 java file-permissions nio root

Files.walk(Paths.get("/var/")).count()当作为非特权用户运行时,执行可能会抛出异常,因为内部/var/存在需要遍历root权限的文件夹.

不是在寻找以root(例如sudo find /var),使用Process等方式执行bash命令的方法.

我只是想确保Files.walk(Paths.get("/var/")).count()不抛出AccessDeniedException:

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0
    at sun.reflect.NativeMethodAccessorImpl.invoke
    at sun.reflect.DelegatingMethodAccessorImpl.invoke
    at java.lang.reflect.Method.invoke
    at org.springframework.boot.devtools.restart.RestartLauncher.run
Caused by: java.io.UncheckedIOException: java.nio.file.AccessDeniedException: /var/cache/httpd
    at java.nio.file.FileTreeIterator.fetchNextIfNeeded
    at java.nio.file.FileTreeIterator.hasNext
    at java.util.Iterator.forEachRemaining
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining
    at java.util.stream.AbstractPipeline.copyInto
    at java.util.stream.AbstractPipeline.wrapAndCopyInto
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential
    at java.util.stream.AbstractPipeline.evaluate
    at java.util.stream.LongPipeline.reduce
    at java.util.stream.LongPipeline.sum
    at java.util.stream.ReferencePipeline.count
    at com.example.DemoApplication.main
    ... 5 more
Caused by: java.nio.file.AccessDeniedException: /var/cache/httpd
    at sun.nio.fs.UnixException.translateToIOException
    at sun.nio.fs.UnixException.rethrowAsIOException
    at sun.nio.fs.UnixException.rethrowAsIOException
    at sun.nio.fs.UnixFileSystemProvider.newDirectoryStream
    at java.nio.file.Files.newDirectoryStream
    at java.nio.file.FileTreeWalker.visit
    at java.nio.file.FileTreeWalker.next
    at java.nio.file.FileTreeIterator.fetchNextIfNeeded
Run Code Online (Sandbox Code Playgroud)

这只是一个例子.使用filter(...)它可以解决异常.但是这个例子也可以扩展到其他用例.

所以简而言之这是否可能,对于CLI,JavaFX等应用程序在通过诸如java -jar app.jar?之类的方法从命令行执行后获得root权限?

Lin*_*abo 9

如果你想要的实际上是跳过你无法访问的路径,你有两种方法:

在这个问题的答案中,解释了如何获取可以访问的子树的所有文件的流.

但是这个例子也可以扩展到其他用例.

FileVisitor的

使用a FileVisitor添加了大量代码,但在处理目录树时可以更灵活.要解决同样的问题,您可以替换Files.walk()为:

Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);
Run Code Online (Sandbox Code Playgroud)

扩展SimpleFileVisitor(计算文件)并覆盖某些方法.

您可以:

  1. 覆盖visitFileFailed方法,处理由于某些原因无法访问文件的情况; (Lukasz_Plawny的建议)
  2. (可选)重写preVisitDirectory方法,访问该目录之前检查权限:如果你不能访问它,就可以直接跳过其子树(请记住,您可以访问的目录中,但不是所有的文件);

例如1

@Override
public FileVisitResult visitFileFailed(Path file, IOException exc) {
    // you can log the exception 'exc'
    return FileVisitResult.SKIP_SUBTREE;
}
Run Code Online (Sandbox Code Playgroud)

例如2

@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {

    if(!Files.isReadable(dir))
        return FileVisitResult.SKIP_SUBTREE;

    return FileVisitResult.CONTINUE;

}
Run Code Online (Sandbox Code Playgroud)

FileVisitor文档

FileVisitor教程

希望能帮助到你.

  • 我的建议是从`FileVisitor`实现`visitFileFailed`方法,当无法访问文件时调用它.当您向此方法添加`return FileVisitResult.SKIP_SUBTREE;`时,将不会抛出AccessDeniedException. (2认同)

Vla*_*liy 2

没有简单的方法来更改权限。Java 不擅长这些任务。只有一些技巧,例如在启动时检查权限并尝试通过 su/sudo 更改权限,然后重新启动应用程序或使用 Java-gnome。请在这里阅读更多内容:Java:在 Ubuntu 上询问 root 权限


归档时间:

查看次数:

3677 次

最近记录:

9 年,6 月 前