Quando si esegue Files.walk(Paths.get("/var/")).count()
come utente non privilegiato, l'esecuzione potrebbe generare un'eccezione in quanto vi sono cartelle all'interno di /var/
che richiedono il permesso di root per essere attraversate.C'è un modo per un'app Java per ottenere i permessi di root?
Sono non alla ricerca di un modo per eseguire un comando bash come root (ad esempio sudo find /var
), utilizzando Process
, ecc
Voglio solo fare in modo Files.walk(Paths.get("/var/")).count()
non significa gettare un 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
Questo è solo un esempio. Utilizzando filter(...)
è possibile aggirare l'eccezione. Ma questo esempio può essere esteso anche ad altri casi d'uso.
Quindi in breve È possibile, per le applicazioni CLI, JavaFX e così via, ottenere le autorizzazioni root dopo che sono state eseguite dalla riga di comando tramite un metodo come java -jar app.jar
?
Se fosse possibile, sarebbe un grosso problema di sicurezza ... Immagina che l'app abbia accesso root e 'rm -rf /'. OOOPS. – Tunaki
L'app può visualizzare una finestra di dialogo e chiedere all'utente di immettere la password sudo/root. Molte app native hanno già questa capacità. Per esempio. Software Gnome, Utility Disco, ecc. OOOPS. ;-) – Behrang
I _think_ l'approccio generale è quello di ottenere le informazioni di accesso amministratore/root, e quindi generare un processo separato come tale utente e fare in modo che il processo separato faccia il lavoro. Probabilmente dovresti farlo in modo diverso su ogni piattaforma. Non so se esiste un framework multipiattaforma che lo gestisce per te (e come probabilmente saprai, chiederne uno sarebbe OT su SO). Ad esempio, vedere [qui] (http://stackoverflow.com/q/4662574/1076640) per la risposta di Windows. – yshavit