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

51

Je suis habitué à exécuter des scripts au démarrage sous Linux, mais je ne sais pas comment faire cela sous Android. J'aimerais commencer mon démon SSH au démarrage, donc je pourrai toujours me connecter. Comment puis-je exécuter un script arbitraire au démarrage d'Android? Il serait préférable de le faire en dehors de Dalvik.

Naftuli Kay
la source

Réponses:

42

En regardant autour de mon système de fichiers Android, j'ai découvert qu'il en avait un, en fait /etc/init.d/. Après avoir jeté un coup d'œil, j'ai trouvé /etc/init.d/20userinitles 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 copié sur mon appareil:

#!/system/bin/sh 

dropbear -s -g 

(poussé sur l'appareil via scp userinit.sh phone:/data/local/userinit.sh, remarquez:])

Redémarrez le périphérique, puis ps | grep "[d]ropbear"exécutez-le et, bien sûr, il fonctionne. Fraîcheur!

Naftuli Kay
la source
Les commentaires ne sont pas pour une discussion prolongée; cette conversation a été déplacée pour discuter .
Seigneur du Feu
9

/data/init.shfonctionne au démarrage, si vous avez la racine, vous pouvez le modifier comme vous le souhaitez. Faites attention ;)

Éditer: Apparemment, vous devrez peut-être insérer le script modifié dans l'image de démarrage également. Informations sur la procédure à suivre ici: http://forum.xda-developers.com/showthread.php?t=443994

Matthew Read
la source
1
Oui, je n'arrive pas à trouver ce fichier sur mon Nexus One sous CM7-RC1. Je verrai si un find / -name "init.sh"tourne quoi que ce soit. Existe-t-il d'autres scripts qui s'exécutent au démarrage?
Naftuli Kay
1
Vous devriez avoir un /etc/init.rcqui commence la coquille. Il devrait appeler init.sh mais si ce n’est pas le cas, vous pouvez simplement le faire appeler votre propre script.
Matthew Lu
Malheureusement, je n'ai pas ce script non plus, mais j'ai trouvé une solution.
Naftuli Kay
3
Quelle version d'Android est-ce? 4.3 a /datamais non /data/init/.shou /etc/init.rc. Grep ne trouve aucune instance intéressante de la chaîne initdans /etc(même récursive).
Stéphane Gourichon
Avez-vous une idée de la manière d’ajouter un script de démarrage lors de la création d’APOS?
Saleh
4

Rechercher dans le /etc/répertoire. Il est généralement placé dans une /system/partition que vous pouvez monter en tant que 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 étapes ci-dessus peuvent être remplacées par:

$ adb root
$ adb remount

et plus tard remonter RO:

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

Maintenant, votre tâche est de trouver un *rcfichier exécutable ou un fichier 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 fichier a été utilisé.

Les bons candidats pour inclure des scripts personnalisés sont les lignes de:

$ grep service /init*.rc

Comme chaque appareil est unique, vous devrez peut-être vous-même deviner les critères de recherche ...

Par exemple, j'ai trouvé /etc/mkshrclequel utilisé par Korn Shell. Je mets à jour ce fichier pour étendre PATHenv var et maintenant chaque fois que adb shellj’ai des liens symboliques Busybox dans mon PATH!

Voir aussi difficile (si vous n'avez pas de chance avec la recherche de fichier magique ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc

Gavenkoa
la source
Mais n'est-il pas annulé à chaque démarrage? Je pense que le dossier / etc fait partie de cpio qui est ramdisk.
Ransh
1
@ transh ce n'est pas le cas au moins dans: 8.1.0_r60 où /systemest system.imget /etcest un lien symbolique dans /system.
Ciro Santilli au mois de
1

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

trouver le fichier /system/etc/install-recovery.shet ajouter la ligne suivante au début /data/init.sh &

ensuite

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

Terminé! Vous pouvez maintenant mettre ce que vous voulez /data/init.shet il sera lancé au démarrage. Si le fichier /system/etc/install-recovery.shne se trouve pas dans votre système, cette réponse ne fonctionnera pas pour vous. Ne vous embêtez pas pour le créer.

Ramast
la source
1
En fait, j'ai un système où il /system/etc/install-recovery.shn'était pas présent, mais il est toujours exécuté au démarrage s'il est présent, donc ça vaut la peine de vérifier.
Jcaron
1

Les choses étaient simples avant Android 5, à la différence de SELinux enforcing. Vous pouvez placer votre code dans n'importe quel script ou remplacer un fichier binaire par un script exécuté avec les privilèges root au démarrage. Une autre méthode consistait à définir un initservice personnalisé spécifiquement pour exécuter par lots des scripts à partir de certains répertoires.

Sur la base de ces approches développeurs de ROM personnalisées introduites différentes pseudo-init.d phénomène comme /etc/init.d/, /etc/install-recovery.sh, /etc/init.qcom.post_boot.sh, /system/bin/debuggerd, /data/init.sh, /data/local/userinit.sh, /data/local/init.d/etc.

Cependant, un processus fonctionnant avec UID, 0mais dans un contexte SELinux restreint, est totalement impuissant. Un service a commencé en init.rcfichier avec u:r:init:s0contexte ne peut même exécuter un script shell à partir /system/bin/, si les besoins de la politique SELinux à patcher pour injecter un libre contexte par exemple Magisk définit u:r:magisk:s0 . Après cela, il est possible d'exécuter un script directement en tant que initservice ou à partir d'un init.drépertoire similaire.

Pour plus de détails, voir Comment exécuter un fichier exécutable au démarrage et le garder actif?

Irfan Latif
la source
0

Manière simple (travail):

  1. Préparez vos commandes de post-démarrage dans un script, par exemple, / system / xbin / post-boot (set exec perm)

  2. Ajoutez le chemin de script personnalisé ci-dessus à la fin de /system/etc/init.qcom.post_boot.sh

Par exemple:

echo / system / xbin / post-boot >> /system/etc/init.qcom.post_boot.sh

Terminé!

(Si vous ne trouvez pas le qcom post_boot (périphériques Qualcomm), recherchez des scripts post_boot)

Seff
la source