67 votes

Comment puis-je exécuter un script au démarrage ?

J'ai l'habitude d'exécuter des scripts au démarrage sous Linux, mais je ne suis pas sûr de savoir comment le faire sous Android. J'aimerais lancer mon démon SSH au démarrage, afin d'être toujours en mesure de me connecter. Comment puis-je exécuter un script arbitraire au démarrage d'Android ? Il serait préférable de faire cela en dehors de Dalvik.

51voto

mjlee Points 949

En cherchant dans le système de fichiers de mon Android, j'ai découvert qu'il y avait en fait un fichier /etc/init.d/ répertoire. Après avoir jeté un coup d'oeil là-dedans, j'ai trouvé /etc/init.d/20userinit avec les lignes suivantes :

if [ -e /data/local/userinit.sh ];
then 
    log -p -i -t userinit "Executing /data/local/userinit.sh";
    busybux chmod +x /data/local/userinit.sh;
    logwrapper /system/bin/sh /data/local/userinit.sh;
    setprop cm.userinit.active 1;
fi;

Ceci étant, bien sûr, exactement ce dont j'avais besoin, j'ai écrit le script suivant sur mon ordinateur puis je l'ai poussé sur mon appareil :

#!/system/bin/sh 

dropbear -s -g 

(poussé vers le dispositif via scp userinit.sh phone:/data/local/userinit.sh ] )

Redémarrez l'appareil, puis exécutez ps | grep "[d]ropbear" et bien sûr, il fonctionne. Coolness !

0 votes

Les commentaires ne sont pas destinés à une discussion approfondie ; cette conversation a été déplacé vers le chat .

0 votes

Il semble que Lineageos soit livré avec un 90userinit exatcly like that. Merci beaucoup pour l'astuce !

2 votes

Mais mieux vaut utiliser magisk github.com/topjohnwu/Magisk/blob/master/docs/

10voto

Matthew Read Points 50150

/data/init.sh s'exécute au démarrage, si vous avez Root vous pouvez l'éditer comme vous le souhaitez. Soyez prudent ;)

Edit : Apparemment, vous devrez peut-être insérer le script édité dans l'image de démarrage également. Des informations sur la façon de le faire sont disponibles ici : http://forum.xda-developers.com/showthread.php?t=443994

1 votes

Oui, je n'arrive pas à trouver ce fichier sur mon Nexus One sous CM7-RC1. Je vais voir si un find / -name "init.sh" ne donne rien. Y a-t-il d'autres scripts qui s'exécutent au démarrage ?

1 votes

Vous devriez avoir un /etc/init.rc qui démarre le shell. Il devrait appeler init.sh mais si ce n'est pas le cas, vous pouvez le faire appeler votre propre script.

0 votes

Malheureusement, je n'ai pas non plus ce script, mais j'ai trouvé une solution.

8voto

Daniel Dolz Points 1443

Si vous avez magisk installé, vous pouvez placer le .sh dans :

/sbin/.magisk/img/.core/service.d/

ou à

/sbin/.magisk/img/.core/post-fs-data.d/

N'oubliez pas de le rendre exécutable : chmod +x your-script.sh .

Plus d'informations : https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts

1 votes

Meilleure réponse maintenant 2021

6voto

gavenkoa Points 293

Regardez /etc/ répertoire. Habituellement, il est placé dans /system/ que vous pouvez monter comme RW :

$ ls -l /etc
lrwxrwxrwx 1 root root 11 Jan 1  2009 /etc -> /system/etc
$ su
$ mount -o remount,rw /system
$ chmod o+w /system/etc  # for "adb push"

Certaines des étapes ci-dessus peuvent être remplacées par :

$ adb root
$ adb remount

et de remonter plus tard RO :

$ chmod o-w /system/etc
$ mount -o remount,ro /system

Maintenant, votre tâche consiste à trouver l'exécutable ou *rc que vous modifiez pour atteindre votre objectif :

$ find /etc -type f -perm +110
$ find /etc -name "*rc"
$ find /etc -name "init*"
$ grep -R /data /etc
$ grep -R /system /etc

Google sur chaque candidat pour savoir comment ce dossier a été utilisé.

Bon candidat pour inclure les scripts personnalisés sont des lignes de :

$ grep service /init*.rc

Comme chaque appareil est unique, vous devrez peut-être faire votre propre estimation des critères de recherche...

Par exemple, j'ai trouvé /etc/mkshrc qui est utilisé par le shell Korn. Je mets à jour ce fichier pour étendre PATH et maintenant, chaque fois que je fais adb shell J'ai des liens symboliques Busybox dans mon PATH !

Voir aussi manière dure (si vous n'avez pas de chance de trouver magie ) : https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

0 votes

Mais n'est-il pas remplacé à chaque démarrage ? Je pense que le dossier /etc fait partie de cpio qui est un ramdisk.

1 votes

@ransh ce n'est pas le cas au moins dans : 8.1.0_r60 où /system es system.img y /etc est un lien symbolique vers /system .

4voto

dampier Points 1308

J'ai essayé toutes ces méthodes et aucune n'a fonctionné pour moi. Ce qui a fonctionné cependant était basé sur la réponse de lord-ralf-adolf ici Comment exécuter un script au démarrage dans CM12.1 ?

En fait, il faut trouver le fichier /system/etc/install-recovery.sh et ajoutez la ligne suivante au début /data/init.sh &

puis

touch /data/init.sh
chmod 755 /data/init.sh

C'est fait ! Vous pouvez maintenant mettre ce que vous voulez dans /data/init.sh et il sera exécuté au démarrage. Si le fichier /system/etc/install-recovery.sh n'est pas dans votre système, alors cette réponse ne fonctionnera pas pour vous. Ne prenez pas la peine de la créer.

4 votes

En fait, j'ai un système où /system/etc/install-recovery.sh n'était pas présent, mais il est toujours exécuté au démarrage s'il est présent, donc cela vaut la peine de le vérifier.

1 votes

C'est la seule chose qui fonctionnait avec Android 9.

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