Come posso eseguire uno script all'avvio?


51

Sono abituato a eseguire script all'avvio in Linux, ma non sono sicuro di come farlo in Android. Vorrei avviare il mio demone SSH all'avvio, quindi sarò sempre in grado di connettermi. Come posso eseguire uno script arbitrario all'avvio di Android? Sarebbe preferibile farlo al di fuori di Dalvik.

Risposte:


42

Mentre guardavo il mio filesystem Android, ho scoperto che ce l'aveva, infatti aveva una /etc/init.d/directory. Dopo aver dato una sbirciatina lì dentro, ho trovato /etc/init.d/20userinitcon le seguenti righe:

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;

Essendo questo, ovviamente, esattamente ciò di cui avevo bisogno, ho scritto il seguente script sul mio computer e l'ho trasferito sul mio dispositivo:

#!/system/bin/sh 

dropbear -s -g 

(inviato al dispositivo tramite scp userinit.sh phone:/data/local/userinit.sh, attenzione:])

Riavviato il dispositivo, quindi eseguito ps | grep "[d]ropbear"e, sicuramente, è in esecuzione. Coolness!


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
Firelord

9

/data/init.shviene eseguito all'avvio, se hai root puoi modificarlo come preferisci. Stai attento ;)

Modifica: a quanto pare potrebbe essere necessario inserire lo script modificato anche nell'immagine di avvio. Informazioni su come farlo qui: http://forum.xda-developers.com/showthread.php?t=443994


1
Sì, non riesco a trovare questo file sul mio Nexus One con CM7-RC1. Vedrò se find / -name "init.sh"si alza qualcosa. Ci sono altri script che vengono eseguiti all'avvio?
Naftuli Kay

1
Dovresti averne uno /etc/init.rcche avvia la shell. Dovrebbe chiamare init.sh, ma in caso contrario puoi semplicemente farlo chiamare il tuo script.
Matthew Leggi il

Sfortunatamente, non ho nemmeno quello script, ma ho trovato una soluzione.
Naftuli Kay,

3
Quale versione di Android è? 4.3 ha /datama no /data/init/.sho /etc/init.rc. Grep non trova alcuna istanza interessante della stringa initin /etc(nemmeno ricorsiva).
Stéphane Gourichon,

Hai idea di come aggiungere lo script di avvio durante la creazione di AOSP?
Saleh,

4

Guarda nella /etc/directory. Di solito è posizionato in una /system/partizione che puoi montare come 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"

Alcuni passaggi precedenti potrebbero essere sostituiti da:

$ adb root
$ adb remount

e successivamente rimontano RO:

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

Ora il tuo compito di trovare file eseguibile o *rcfile che modifichi per raggiungere il tuo obiettivo:

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

Google su ciascun candidato per sapere come è stato utilizzato questo file.

Un buon candidato per includere script personalizzati sono le righe da:

$ grep service /init*.rc

Poiché ogni dispositivo è univoco, potrebbe essere necessario fare delle ipotesi sui criteri di ricerca ...

Ad esempio ho trovato quello /etc/mkshrcusato dalla shell Korn. Aggiornamento questo file per estendere PATHenv var e ora ogni volta che lo faccio adb shellho link simbolici Busybox nel mio PERCORSO!

Vedi anche il modo difficile (se non hai fortuna con la ricerca di file magico ): https://stackoverflow.com/questions/9768103/make-persistent-changes-to-init-rc


Ma non viene superato ogni avvio? Penso che la cartella / etc sia parte di cpio che è ramdisk.
ransh,

1
@ransh questo non è il caso almeno in: 8.1.0_r60 dove si /systemtrova system.imged /etcè un collegamento simbolico in /system.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

1

Ho provato tutti questi metodi e nessuno di loro ha funzionato per me. Ciò che ha funzionato, tuttavia, si basava sulla risposta di lord-ralf-adolf qui Come eseguire uno script all'avvio in CM12.1?

fondamentalmente, trova il file /system/etc/install-recovery.she aggiungi la seguente riga all'inizio /data/init.sh &

poi

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

Fatto! Ora puoi inserire quello che vuoi /data/init.she verrà eseguito all'avvio. Se il file /system/etc/install-recovery.shnon è nel tuo sistema, questa risposta non funzionerà per te. Non preoccuparti di crearlo.


1
In realtà, ho un sistema in cui /system/etc/install-recovery.shnon era presente, ma è comunque eseguito all'avvio se presente, quindi vale la pena controllarlo.
jcaron,

1

Le cose erano semplici prima di Android 5 quando SELinux non lo era enforcing. È possibile inserire il codice in qualsiasi script o sostituire un file binario con uno script che è stato eseguito con i privilegi di root all'avvio. Un altro metodo consisteva nel definire un initservizio personalizzato specifico per l'esecuzione in batch di script da alcune directory.

Sulla base di questi approcci sviluppatori ROM personalizzata introdotte diverse pseudo-init.d fenomeno come /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.

Tuttavia, un processo in esecuzione con UID 0ma in un contesto SELinux limitato è piuttosto impotente. Un servizio iniziato nel init.rcfile con u:r:init:s0contesto non possono anche eseguire uno shell script da /system/bin/, così esigenze politiche SELinux di una patch per iniettare una illimitata contesto es Magisk definisce u:r:magisk:s0 . Successivamente è possibile eseguire uno script direttamente come initservizio o da una init.ddirectory simile.

Per i dettagli, vedere Come eseguire un eseguibile all'avvio e mantenerlo in esecuzione?


0

Modo semplice (funzionante):

  1. Prepara i tuoi comandi post boot in uno script, ad esempio / system / xbin / post-boot (imposta exec perm)

  2. Aggiungi il percorso di script personalizzato sopra alla fine di /system/etc/init.qcom.post_boot.sh

Per esempio:

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

Fatto!

(Se non riesci a trovare qcom post_boot (dispositivi Qualcomm), cerca eventuali script post_boot)


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.