7 votes

Exécuter une commande shell téléchargée sans Root ?

Mon téléphone est un Galaxy S3, non enraciné . J'ai installé "ES File Explorer" et "Terminal Emulator".

J'ai téléchargé une version Android de 'wget', avec l'intention de l'exécuter à partir de l'émulateur de terminal. Le fichier existe actuellement dans /storage/sdcard0/Download (qui est une partition interne, pas une carte SD physique) comme :

-rw-rw-r-- root sdcard_rw 241974 2016-03-11 wget

./wget donne Permission refusée. chmod o+x wget donne "Bad mode" ; cela est apparemment dû au fait que l'interface de l'Android chmod n'accepte que les chiffres octaux ; chmod 665 wget donne "Opération non autorisée". Je peux copier le fichier avec "cp", donc le système de fichiers est accessible en écriture.

D'autres questions-réponses donnent plusieurs raisons possibles pour lesquelles chmod à défaut sur Android. L'une d'entre elles est une carte SD formatée en FAT qui ne prend pas en charge les bits de permission ; mais comme je l'ai dit, il ne s'agit pas d'une carte SD. Une autre est le système de fichiers monté avec "noexec". Ma connaissance d'Android/Linux est bien trop faible pour vérifier de telles choses.

Android me bloque-t-il l'exécution de wget à dessein ? Y a-t-il un moyen de l'exécuter sans mettre mon téléphone en rooting ?

0 votes

Utiliser le sh avant d'invoquer votre script. Voir ici : Permissions de script shell pour les passionnés d'Android

1 votes

@Chungzuwalla : Si vous voulez la commande wget sans rooter, vous pourriez être intéressé par cette version busybox de wget .

0 votes

Merci @AaronGillion, j'ai essayé d'utiliser sh mais comme wget est un binaire, il donne juste une erreur de syntaxe. Il semble que ce que @MatijaNalis a écrit ci-dessous à ce sujet soit correct.

6voto

Matthew Read Points 50150

Oui, c'est à dessein. Vous ne pouvez pas exécuter de binaires à partir de la carte SD sans les privilèges du système ou du superutilisateur (et en la remontant sans l'option noexec ), car sinon les applications pourraient télécharger et exécuter du code malveillant à volonté. Dans les anciennes versions d'Android, la carte SD n'avait pas non plus de permissions émulées, donc chmod échouerait naturellement.

Certains appareils/anciennes versions d'Android peuvent permettre l'exécution à partir de /data/local/tmp/ donc vous pouvez essayer de le mettre là. Sinon, vous aurez probablement besoin de Root.

0 votes

Merci de votre attention ! Je pensais que c'était le système de permissions de l'application qui contrôlait ce qu'une application pouvait faire, donc le téléchargement et l'exécution de code ne poseraient pas de problème s'ils ne nécessitaient pas de privilèges supérieurs à ceux que l'application possède déjà. Quoi qu'il en soit, je n'ai pas /local ou du moins je ne le vois pas. Je pense que la structure des systèmes de fichiers UN*X va rester un mystère pour moi pendant encore longtemps.

0 votes

Les applications peuvent toutefois exécuter leurs propres binaires. Puisque vous avez installé l'application terminal, n'importe quel binaire de cette application peut être exécuté. Par conséquent, copiez le binaire dans le dossier app de l'application terminal et vous pourrez l'exécuter à partir de là. J'ai essayé, ça marche.

0 votes

@TJJ C'est astucieux !

5voto

Grimoire Points 2908

Android, tout comme Linux, empêche tout utilisateur, à l'exception de Root, de modifier les bits de permission de tout fichier n'appartenant pas à cet utilisateur. Cela dit, chmod est inefficace, à moins que vous ne disposiez des privilèges de Root.

D'ailleurs, même si vous aviez de tels privilèges, vous n'auriez pas pu modifier les permissions, tant que le chemin cible est /storage/sdcard0 o /storage/emulated/0 . Cela dépend d'une politique de sécurité, qui est mise en œuvre sous la forme de l'option FUSE et peut être contourné en passant sur le système de fichier /data/media/0 o /data/media/emulated/0 et de coder le fichier à partir de cette position. Veuillez noter que cette procédure vous permettra d'exécuter un script seulement si vous le lancez à partir de l'un des emplacements mentionnés ci-dessus.

Enfin, il est à noter que le portage Android de l'application chmod ne supporte pas l'édition symbolique des drapeaux ( +rwx et ainsi de suite), vous serez donc obligé de les éditer via leurs valeurs octales correspondantes. Vous aurez également besoin des privilèges de Root, afin de pouvoir accéder à /données/médias . Essayer de cd vers un tel répertoire en utilisant les privilèges de l'utilisateur entraîne un Permission refusée erreur.

0 votes

Je pense que c'est là que je m'embrouille vraiment. Lorsque j'ai téléchargé le binaire wget (en utilisant un navigateur, je ne me souviens plus lequel maintenant), il a été enregistré comme appartenant à Root. Si je le copie avec cp dans l'émulateur de terminal, la copie appartient également à Root. Je peux supprimer la copie. Mais l'interpréteur de commandes de Terminal Emulator n'est pas un interpréteur de commandes de Root. Il y a beaucoup de choses qui me déroutent à ce sujet. Mais c'est une toute autre question...

0 votes

@Chungzuwalla Copier un fichier est une opération généralement autorisée, à condition que le fichier à copier n'ait pas été verrouillé (comme le fichier /etc/shadow sous Linux). Changer les permissions, par contre, est une opération dangereuse, car, si elle est effectuée par un utilisateur non fiable, elle peut interdire l'accès à presque n'importe quel fichier ( chmod 000 ).

0voto

Matija Nalis Points 194
  • d'abord, pour rendre le fichier exécutable, vous devez faire chmod 775 wget (et non 665)
  • mais, vous ne pouvez changer les modes du fichier que si vous en êtes le propriétaire (ou Root). Dans votre cas, le propriétaire est root (et groupe sdcard_rw comme indiqué par votre ls -l ), donc seulement root peut modifier les permissions. Comme vous n'êtes pas Root (vous pouvez vérifier auprès de id mais comme vous le dites, vous n'avez pas d'appareil rooté, donc vous ne pouvez pas utiliser la commande su pour devenir Root) vous ne pouvez pas changer ses permissions.
  • De plus, les modes ne peuvent être modifiés que si le système de fichiers contenant le fichier supporte les permissions UN*X. Votre /storage/sdcard0/Download est probablement FAT, qui ne le supporte pas (vous pouvez vérifier le type de système de fichier avec cat /proc/mounts )

Ceci dit, si le fichier est un script shell, vous pouvez l'exécuter même si le fichier est manquant. x mode avec sh /storage/sdcard0/Download/script .

Mais s'il s'agit d'un binaire ELF (comme c'est le cas avec votre wget ), vous n'avez probablement pas de chance sur Android (sur un système GNU/Linux de bureau, vous peut exécuter des binaires ELF indirectement via un linker dynamique /lib64/ld-linux-x86-64.so.2 /mnt/Download/wget mais je ne pense pas qu'Android permette la même chose avec ses /system/bin/linker - Je peux me tromper sur ce point, mais)

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X