Android:/ data / local / tmp / *的权限被拒绝

时间:2014-05-02 09:12:04

标签: java android shell

我正在尝试通过Android应用程序运行shell脚本。该脚本有一个命令,它只在设备上运行一个jar。当我使用adb直接在shell上运行此命令时,一切正常。但是当我使用Android应用程序通过脚本运行它时,我获得了在/ data / local / tmp文件夹中创建的文件的权限被拒绝异常(打开失败:EACCES(Permission denied))。谁能指导如何解决这个问题?

这就是我的清单看起来像

<manifest ….>
   <uses-sdk …>
    <uses-permission… .>
    …
    <uses-permission  android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    …
    <application …>
    …
    </application>
</manifest>

感谢。

4 个答案:

答案 0 :(得分:8)

如果我正确理解了场景,您可以动态创建脚本,并使用/data/local/tmp作为一个既可公开写入又可执行的简单位置。有一次,这是可能的。但是在Android的最新版本中,安全性已经收紧。

您的应用可以在/data/data/${your.package}下执行文件。您可以使用getContext().getFilesDir()可靠地获取完整路径。请注意,您仍然需要使用chmod 500来确保该文件具有可执行权限。

如果您有一些必须与您的应用程序一起安装的固定可执行文件(二进制文件或脚本),有一个聪明的技巧让系统软件包安装程序为您处理所有这些:确保文件名为“< b> lib .so “并将其放在Eclipse项目根目录下的/libs/armeabi目录中。安装后,文件将出现在getContext().getApplicationInfo().nativeLibraryDir目录中,并设置了可执行权限。


PS 您无需 WRITE_EXTERNAL_STORAGE 权限即可(也许您需要将其应用到您的应用中)。


PPS 您可以从任何地方运行shell脚本,包括/sdcard,并且您不需要脚本的可执行权限。相反,请使用sh -c source full.path.to.script

答案 1 :(得分:1)

我认为原因是你的Andorid没有扎根。 “/ data”具有root权限。 因此,请首先根据您的手机,并授予您的应用权限。 你可以尝试命令:“su”将shell更改为root。

答案 2 :(得分:1)

您可以使用adb界面将文件复制和/或推送到/data/local/tmp文件夹,但如果您想在终端应用中使用/查看它们,您需要(在adb界面中)首先

cd /data/local/tmp 

然后在文件夹中创建一个文件夹。示例

mkdir folder 

接下来更改权限

chmod - R 777 folder 

现在您有一个可以读写的文件夹。

我想知道的一些事情是如何让系统认为su二进制文件位于/system/bin文件夹中(没有复制)因为我只能得到tmp ... root访问因为即使使用root访问权限,我也无法将系统目录重新安装为rw,因为zte-paragon将其系统分区格式化为只读文件系统

答案 3 :(得分:0)

确保/data/local/tmp位置在您的设备上具有全球可执行性:

adb shell ls -ld /data/ /data/local/ /data/local/tmp/

drwxrwx--x system   system            XXXX-XX-XX XX:XX
drwxr-x--x root     root              XXXX-XX-XX XX:XX
drwxrwx--x shell    shell             XXXX-XX-XX XX:XX
#        ^ all x here == OK!

如果不是,那么您无能为力,而且您需要使用标准存储空间(内部/data/data/{package}或外部/sdcard/)。

确保您使文件具有全球可读性。

adb shell chmod o+r /data/local/tmp/myfile.txt

您不需要任何权限。