【问题标题】:/data/local/tmp/test error=13, Permission denied/data/local/tmp/test 错误=13,权限被拒绝
【发布时间】:2020-02-24 16:11:46
【问题描述】:

我在/data/local/tmp 的设备上有本机可执行文件,并使用 java api 运行 exe java.runtime.exec() 方法。但是,我收到权限被拒绝错误:13(下面附加了堆栈跟踪。)

String runexec= "/data/local/tmp/test";
Process p = Runtime.getRuntime().exec(runexec);




Java.io.IOException: Cannot run program "/data/local/tmp/test": error=13, Permission denied
W/System.err:     at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
W/System.err:     at java.lang.Runtime.exec(Runtime.java:692)
W/System.err:     at java.lang.Runtime.exec(Runtime.java:525)
W/System.err:     at java.lang.Runtime.exec(Runtime.java:422)
W/System.err:     at android.view.View.performClick(View.java:6891)
W/System.err:     at android.widget.TextView.performClick(TextView.java:12651)
W/System.err:     at android.view.View$PerformClick.run(View.java:26083)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:789)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:98)
W/System.err:     at android.os.Looper.loop(Looper.java:164)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:6938)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
W/System.err: Caused by: java.io.IOException: error=13, Permission denied
W/System.err:     at java.lang.UNIXProcess.forkAndExec(Native Method)
W/System.err:     at java.lang.UNIXProcess.<init>(UNIXProcess.java:133)
W/System.err:     at java.lang.ProcessImpl.start(ProcessImpl.java:128)
W/System.err:     at java.lang.ProcessBuilder.start(Pro


编辑:test exe 具有a+x or say 777 权限,并通过 adb shell 正常运行,但是在使用 java 调用时失败。

【问题讨论】:

  • 您可能拥有test 的权限,但您是否拥有路径的其他所有部分的权限?
  • 是的,我已经验证了文件夹和文件的权限。使用su -c ... 调用的测试工作
  • 验证 data、local 和 tmp 是目录,并且 test 实际上是一个 exe(而不是目录或某些不可执行的数据文件)。
  • 是的,我可以列出文件但不能执行。
  • 您使用的是什么操作系统?我认为现在很清楚,根本问题与操作系统相关,而不是 Java。这听起来会很奇怪,就像一个用 noexec 挂载的文件系统。我在这里很快就超出了我的深度,所以我建议尝试 unix.stackexchange.com。我假设您使用su 时使用的是root?

标签: java android android-permissions


【解决方案1】:

您正在使用Android OS。我在 RHEL 上遇到了类似的问题。 秘诀在于 SELINUX 只是 LOVES 来防止此类事情发生。

检查日志文件/var/log/messages 并在其中搜索您的可执行文件名称。您可能会发现与此类似的内容: "SELinux 正在阻止 pool-2-thread-1 对文件 &lt;your_exec_here&gt; 执行访问"

【讨论】:

  • 感谢延迟回答,但是,我无法在可用的 android 设备上测试和重现它。无论如何,您是如何修复 SELINUX 权限的?
  • @user755 这是一个非常漫长而复杂的故事,但涉及使用 ausearch -c ... audit2allow 创建本地策略,使用 semodule -i 激活它们,以及使用在某些文件和程序上设置 SELinux 标签semanage fcontext ...,并使用 restorecon -v 激活它们。你可以在这里阅读其中的一些内容:access.redhat.com/documentation/en-us/red_hat_enterprise_linux/… 祝你好运!
猜你喜欢
  • 2014-06-18
  • 2020-04-03
  • 2018-07-19
  • 2017-04-04
  • 2013-01-25
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多