我正在尝试通过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>
感谢。
答案 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
您不需要任何权限。