Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java应用程序是否有办法获得根权限?_Java_Root_Nio_File Permissions - Fatal编程技术网

Java应用程序是否有办法获得根权限?

Java应用程序是否有办法获得根权限?,java,root,nio,file-permissions,Java,Root,Nio,File Permissions,当以非特权用户身份运行Files.walk(path.get(“/var/”)).count()时,执行可能会引发异常,因为/var/中存在需要根权限才能遍历的文件夹 我不是在寻找一种以root身份执行bash命令的方法(例如,sudofind/var),使用进程,等等 我只想确保Files.walk(path.get(“/var/”).count()不会抛出AccessDeniedException: Exception in thread "restartedMain" java.lang.

当以非特权用户身份运行
Files.walk(path.get(“/var/”)).count()
时,执行可能会引发异常,因为
/var/
中存在需要根权限才能遍历的文件夹

我不是在寻找一种以root身份执行bash命令的方法(例如,
sudofind/var
),使用
进程
,等等

我只想确保
Files.walk(path.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
这只是一个例子。使用
过滤器(…)
可以解决异常问题。但是这个例子也可以扩展到其他用例


简言之,对于CLI、JavaFX等应用程序来说,在通过
java-jar app.jar

等方法从命令行执行后,它们就可以获得root权限,这只是一些完全未经测试的想法:

1)以root权限运行应用程序:

sudojava-jarmyapp.jar

2)让你的应用启动一个请求root权限的启动器类,然后继续运行你的应用的其余部分:

java-jarmyapp.jar

这会依次执行一个shell命令,但只执行一个提示输入root密码的xterm,然后继续运行具有root权限的java程序:

xterm-e“sudosh-c'java-jar/tmp/myrootapp.jar'”

或者使用gksudo使用更好看的东西。注意

也许
myapp.jar
会将自己提取到一个包含
myrootapp.jar
的目录中,因此它可以如上所述启动它。
/tmp
当然应该从java内部检索,最好是一个具有随机名称的目录,只有运行
myapp.jar
的用户才能访问该目录为了防止
myrootapp.jar
注入

跨平台


你提到了
/var/
你自己,所以我假设你是在某种Linux上。如果这是跨平台工作的,例如在Macintosh或Microsoft Windows上,你需要先进行某种系统识别。然后你可以在代码中应用StrategyPattern来处理让
myrootapp.jar
访问ain根权限或管理员权限。

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

它解释了如何获取您可以访问的子树的所有文件的流

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

文件访问者

使用
FileVisitor
会添加大量代码,但在遍历目录树时会给您带来更大的灵活性。要解决同样的问题,您可以将
Files.walk()替换为:

Files.walkFileTree(Path start, FileVisitor<? super Path> visitor);
e、 g.2

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

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

    return FileVisitResult.CONTINUE;

}


希望有帮助。

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

如果可能的话,这将是一个主要的安全问题…Imagine应用程序获得root访问权限并执行
rm-rf/
.OOOPS。应用程序可以弹出一个对话框,要求用户输入sudo/root密码。许多本机应用程序已经具有此功能。例如Gnome软件、磁盘实用程序等。OOOPS;-)正确的问题是“我如何忽略无法访问的位置?”“。请诚实地请求sudo执行您的应用程序。所有linux用户都会喜欢这种方法:我的建议是从
FileVisitor
实现
visitFileFailed
方法,该方法在无法访问文件时调用。添加
返回文件visitResult.SKIP_子树时
,则不会抛出AccessDeniedException。但是,根据应用程序的不同,请记住,以root权限运行应用程序可能会引入更多有害漏洞。例如,当您使用Rhino引擎时,存在注入漏洞,允许攻击者通过该引擎注入任意Java代码。当然,在这种情况下,注入的代码是以root权限运行的。
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) {

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

    return FileVisitResult.CONTINUE;

}