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;
}