web-dev-qa-db-fra.com

Lancer un script en tant que root via ADB

J'ai créé un script pour monter des partitions et effectuer des tâches dans mon système Android. J'ai enregistré le script sous le nom install.sh dans le dossier/bin d'Android.

Je souhaite appeler le script à partir d'ADB, qui est lui-même appelé à partir d'un fichier de commandes sous Windows, mais il doit être exécuté en tant que root.

La première solution que j'ai essayée était d'appeler le script en utilisant

adb Shell "su -c sh /bin/script.sh"

mais cela ne fonctionne pas car il me donne un accès Shell (avec les droits root), mais rien n’est exécuté . J'ai aussi essayé d’appeler 

adb root "sh /bin/script.sh"

mais j'ai eu l'erreur suivante

adbd cannot run as root in production builds

J'ai alors essayé d'écrire

su -c "command"

pour toutes les commandes qui nécessitent un accès root dans mon script, mais j'ai le même problème. Lorsque j'exécute le script, je n'obtiens qu'un shell racine et rien n'est exécuté.

Si j'utilise la première solution manuellement (par exemple, j'appelle adb Shell su, puis mon script), cela fonctionne. Cependant, le but est d'automatiser le processus, de sorte que le shell adb puisse être appelé à partir d'un autre script.

Avez-vous une idée de comment je pourrais y arriver?

Merci !

23
ErGo_404

Cela fonctionne pour moi: 

Créez myscript.bat et mettez-le dedans (notez les guillemets simples autour des commandes à exécuter en mode superutilisateur):

adb Shell "su -c 'command1; command2; command3'"

puis exécutez myscript.bat à partir d'un shell DOS.

Remarque: il ne semble pas que le caractère de continuation de ligne DOS (^) fonctionne dans cette situation. En d'autres termes, ce qui suit ne fonctionne pas pour moi:

adb Shell "su -c '^
command1; ^
command2; ^
command3'"

Cela se traduit par "Erreur de syntaxe: chaîne entre guillemets non terminée"

54
Andy Dennie

Cela marche :

adb Shell echo command which needs root privileges \| su

Si vous avez besoin d'une redirection:

adb Shell echo 'echo anytext > /data/data/aforbiddenfolder/file' \| su

Pour "copier" un fichier local sur un chemin Android nécessitant des privilèges root (mais alocalfile ne doit pas contient '):

cat alocalfile | adb Shell echo "echo '`cat`' > /data/data/aforbiddenfolder/file" \| su

Si vous avez un meilleur moyen (même pour les versions su qui n'ont pas -c), je suis intéressé.

3
rom1v

Cela fonctionne pour moi:

adb Shell "su -c ./data/local/tcpdump-arm -s 0 -v -w /data/local/appxpress_dump.pcap"
2
tn.stackoverflow

mais cela ne fonctionne pas car cela me donne un accès Shell (avec les permissions root), mais rien n'est exécuté.

Comment savez-vous que vous disposez d'autorisations root? Je suppose que vous essayez d'exécuter le script sur un périphérique? Votre appareil a-t-il été enraciné?

Vous devrez peut-être donner des autorisations d'exécution via chmod au fichier.

chmod ugo=rwx /bin/script.sh
0
DavidDraughn

Il semble que j'utilisais une version très simple de su qui n'acceptait pas l'argument -c. J'ai copié un autre su qui a fonctionné. AndyD a tout à fait raison, alors j'accepte sa réponse à la place de la mienne :)

0
ErGo_404

Je ne sais pas si j'ai fourni une solution ou demandé une meilleure. Je voulais exécuter 200 commandes en mode batch à envoyer à adb J'ai suivi cette approche. 

    adb Shell "su -c command ; "
adb Shell "su -c command ; "
adb Shell "su -c command ; "
adb Shell "su -c command ; "

et je les ai sauvegardés dans un fichier batch 

Cette commande

adb Shell "su -c 'command1; command2; command3'"

ne fonctionnera pas au-delà d'une certaine taille maximale. Cela n'a pas fonctionné 

error: service name too long
0
user1874594