8
votes

Android: Autorisation refusé pour / Data / local / TMP / *

J'essaie d'exécuter un script shell via une application Android. Le script a une commande qui exécute simplement un pot sur l'appareil. Lorsque j'exécute cette commande directement sur la coquille en utilisant adb, tout fonctionne bien. Mais lorsque je l'exécute via le script à l'aide de l'application Android, je reçois une exception refusée de permission (Open Échec de l'autorisation: EACCE (autorisation refusée)) pour les fichiers créés dans / Dossier Data / Local / TMP. Quelqu'un peut-il guider sur la manière de résoudre ce problème?

C'est ce que mon manifeste ressemble à xxx

merci.


0 commentaires

4 Réponses :


0
votes

Je pense que la raison est que votre andorid n'est pas enraciné. Les "/ données" ont la permission racine. Alors rootez votre téléphone en premier et donnez à votre application la permission. Vous pouvez essayer la commande: "su" int La coque passe à la racine.


4 commentaires

Enracinant vraiment le problème? Parce que, le script fonctionne bien lorsque je l'exécute de la coquille. C'est-à-dire quand je fais "sudo adb shell", puis exécutez le script à travers la coquille, cela fonctionne comme prévu. Mais lorsque j'exécute le script via l'application à l'aide de runtime.getruntime (). EXED ("SH" + ScriptPath), l'exception de la permission refusée est lancée.


"Sudo adb shell" est la racine de Linux, pas Android. Après entrer dans la coquille: "Shell @ Android: / $", utilisez "SU", puis: "Shell @ Android: / #", vous obtenez la racine pour Android. Si votre Android n'est pas enraciné, "su" ne fonctionnerait pas


Mon appareil n'est pas enraciné. Néanmoins, le script fonctionne bien sans aucun problème d'autorisation si je l'exécute dans la coquille ADB. Mais lorsque je l'exécute à travers le code à l'aide de runtime.getruntime (). EXED ("SH ScriptPath"), je reçois des problèmes d'autorisation pour / Data / Local / TMP / TMP. Comment résoudre ça?


essayez d'utiliser: runtime.getruntime (). EXEC ("su");



12
votes

Si je comprends bien le scénario correctement, vous créez le script à la volée et utilisez / data / local / tmp comme emplacement facile qui est à la fois écritable et exécutable publiquement. Une fois, c'était possible. Mais sur les versions récentes d'Android, la sécurité a été resserrée.

Votre application peut exécuter des fichiers sous / données / données / $ {your.package} . Vous pouvez utiliser getcontext (). GetFilesDir () Obtenir de manière fiable le chemin complet. Notez que vous devez toujours utiliser chmod 500 pour vous assurer que le fichier a exécutable autorisation.

Si vous avez des exécutables fixes (binaires ou scripts) qui doivent être installés avec votre application, il existe une astuce intelligente pour laisser le programme d'installation du package système s'occuper de tout cela pour vous: assurez-vous que le fichier a un nom "< B> lib Quelque chose .so "et le mettre dans / libs / armée sous la racine du projet Eclipse. Après l'installation, les fichiers seront présents dans getContext (). GetApplicationInfo ( ) .nativentibrarydir répertoire avec autorisations exécutables définies.


PS Vous n'avez pas besoin de la permission wreck_external_storage pour que cela fonctionne (vous en avez peut-être besoin pour d'autres choses que votre application).


pps Vous pouvez exécuter un script shell de n'importe où, y compris / sdcard , et vous n'avez pas besoin d'autorisation exécutable pour le script. Au lieu de cela, utilisez la source sh -c complet.path.to.script .


0 commentaires

2
votes

Vous pouvez utiliser l'interface ADB pour copier et / ou appuyer sur les fichiers dans le dossier / data / local / tmp xxx

puis faites un dossier à l'intérieur du dossier. Exemple xxx

modifie ensuite les autorisations xxx

Vous avez maintenant un dossier que vous pouvez lire et écrire à.

Quelques choses que j'aimerais savoir, c'est comment rendre le système pense que le binaire su est dans le dossier / system / code> ( sans copier) parce que je ne peux obtenir que TMP ... accès root car même avec accès root, je ne peux pas remonter le répertoire système comme rw car le ZTE-Paragon a sa partition système formatée en lecture- Seul le système de fichiers


0 commentaires

0
votes

Assurez-vous que l'emplacement / DATA / LOCAL / TMP / TMP / TMP est exécutable mondial sur votre appareil:

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


0 commentaires